使用EXCUTE IMMEDIATE 只能处理单行查询语句,为了动态地处理SELECT语句所返回的多行数据,需要使用OPEN-FOR,FETCH和CLOSE语句。处理步骤如下:
定义游标变量——打开游标变量——循环提取数据——关闭游标变量
1.定义游标变量
TYPE cursortype IS REF CURSOR;
cursor_variable cursortype;
2.打开游标变量
OPEN cursor_variable FOR dynamic_string
[USING bind_argument[, bind_argument]...];
3.循坏提取数据
FETCH cursor_variable INTO {var1[,var2]... | record_var};
4.关闭游标变量
CLOSE cursor_variable;
5.多行查询示例
SQL> declare
2 type empcurtyp is ref cursor;
3 emp_cv empcurtyp;
4 emp_record emp%rowtype;
5 sql_stat varchar2(100);
6 begin
7 sql_stat:='select * from emp where deptno=:dno';
8 open emp_cv for sql_stat using &dno;
9 loop
10 fetch emp_cv into emp_record;
11 exit when emp_cv%notfound;
12 dbms_output.put_line('雇员名:'||emp_record.ename
13 ||',工资:'||emp_record.sal);
14 end loop;
15 close emp_cv;
16 end;
17 /
输入 dno 的值: 10
原值 8: open emp_cv for sql_stat using &dno;
新值 8: open emp_cv for sql_stat using 10;
雇员名:CLARK,工资:1760
雇员名:KING,工资:5500
雇员名:MILLER,工资:3300
雇员名:BAKE,工资:
雇员名:MARY,工资:2200