动态SQL...干嘛弄得这么复杂呢?
使用EXECUTE
IMMEDIATE只能处理单行查询语句,为了动态地处理SELECT语句所返回的多行数据,需要使用OPEN-FOR,FETCH和CLOSE语句。
动态地处理SELECT语句返回多行数据步骤如下
定义游标变量>打开游标变量>循环提取数据>关闭游标变量
1.定义游标变量
因为动态地处理多行查询需要使用游标变量来完成,所以首先需要在定义部分定义游标变量
TYPE 游标变量类型 IS REF CURSOR;
游标变量名 游标变量类型;
2.打开游标变量
在定义了游标变量之后,就可以在执行部分使用OPEN-FOR语句来打开游标变量。当打开游标变量时,会执行游标变量所对应的SELECT语句,并将查询结果存放到游标结果集中。
OPEN 游标变量名 FOR 动态的SELECT语句
[USING bind_argument]
(bind_argument用于指定存放传递给动态SELECT语句值的变量。)
3.循环提取数据
在打开游标变量之后,查询结果已经被存放到游标结果集中。为了取得游标结果集中的所有数据,需要使用FEATH语句提取数据
4.关闭游标变量
CLOSE 游标变量名
5.多行查询示例
下面以动态输入部门号,显示特定部门的所有雇员名称和工资为例:
DECLARE
TYPE empcurtyp IS CURSOR;
emp_cv empcurtyp;
emp_record emp%ROWTYPE;
sql_stat VARCHAR(100);
BEGIN
sql_stat=:'SELECT * FROM emp WHERE deptno=:dno';
OPEN emp_cv FOR sql_stat USING &dno;
LOOP
FETCH emp_cv INTO emp_record;
EXIT WHEN emp_cv%NOTFOUND;
dbms_output.put_line('雇员名:'||emp_record.ename||'工资'||emp.record.sal);
END LOOP;
CLOSE emp_cv;
END;
/
输入dno的值:10
xxxxx