-
说明
- 定义:动态SQL除了处理单行查询操作外,还可以利用游标完成多行数据的操作;在游标定义时也同样可以使用动态绑定变量的方式,此时就需要在打开游标变量时增加USING子句操作;
- 语法:在打开游标变量中使用USING
OPEN 游标变量名称 FOR 动态SQL语句 [USING 绑定变量,绑定变量,....] |
- 语法2:利用FETCH一次性保存多条数据到集合类型中
FETCH 动态游标BULK COLLECT INTO 集合变量 ....; |
-
举个栗子
- 示例1:在游标中使用动态SQL
DECLARE cur_emp SYS_REFCURSOR ; -- 定义游标变量 v_emprow emp%ROWTYPE ; -- 定义emp行类型 v_deptno emp.deptno%TYPE := 10 ; -- 定义要查询雇员的部门编号 BEGIN OPEN cur_emp FOR 'SELECT * FROM emp WHERE deptno=:dno ' USING v_deptno ; LOOP FETCH cur_emp INTO v_emprow ; -- 取得游标数据 EXIT WHEN cur_emp%NOTFOUND ; -- 如果没有数据则退出 DBMS_OUTPUT.put_line('雇员姓名:' || v_emprow.ename || ',雇员职位:' || v_emprow.job) ; END LOOP ; CLOSE cur_emp ; END ; / |
本程序定义了一个弱类型的游标变量,而在程序主体部分使用OPEN....FOR操作要使用的动态SQL,由于此时绑定了一个变量,所以需要使用USING配置此变量内容 |
-
示例2:利用FETCH保存查询结果
DECLARE cur_emp SYS_REFCURSOR ; -- 定义游标变量 TYPE emp_index IS TABLE OF emp%ROWTYPE INDEX BY PLS_INTEGER ; -- 定义索引表 v_emprow emp_index ; -- 定义emp行类型 v_deptno emp.deptno%TYPE := 10 ; -- 定义要查询雇员的部门编号 BEGIN OPEN cur_emp FOR 'SELECT * FROM emp WHERE deptno=:dno' USING v_deptno ; FETCH cur_emp BULK COLLECT INTO v_emprow ; CLOSE cur_emp ; FOR x IN 1 .. v_emprow.COUNT LOOP DBMS_OUTPUT.put_line('雇员编号:' || v_emprow(x).empno || ',姓名:' || v_emprow(x).ename || ',职位:' || v_emprow(x).job) ; END LOOP ; END ; / |
本程序是将游标取得数据,通过FETCH BULK COLLECT INTO 语句一次性地保存在了emp_index类型的变量中,而后采用FOR循环输出游标中的数据 |