-
說明
- 定義:動態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循環輸出遊標中的數據 |