您好,登錄后才能下訂單哦!
這篇文章主要講解了“SYS_REFCURSOR作為過程參數的表現是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SYS_REFCURSOR作為過程參數的表現是什么”吧!
我創建了如下的表并填充數據:
CREATE TABLE plch_tab (item VARCHAR2 (10)) / BEGIN INSERT INTO plch_tab VALUES ('Keyboard'); INSERT INTO plch_tab VALUES ('Mouse'); COMMIT; END; /
然后我創建了這個函數,從游標變量取得一行數據并返回:
CREATE OR REPLACE FUNCTION plch_getitem ( plch_cur IN SYS_REFCURSOR) RETURN plch_tab.item%TYPE IS lvretval plch_tab.item%TYPE; BEGIN FETCH plch_cur INTO lvretval; RETURN lvretval; END plch_getitem; /
現在我需要寫一個程序塊來獲取表里的數據行,并且顯示行數和最后一行的項目名稱。下面就是這個接近完成的版本:
DECLARE lvitem plch_tab.item%TYPE; test_cur SYS_REFCURSOR; BEGIN OPEN test_cur FOR SELECT * FROM plch_tab ORDER BY item; /*FETCH*/ DBMS_OUTPUT.put_line ('Count = ' || test_cur%ROWCOUNT); DBMS_OUTPUT.put_line ('Item = ' || NVL (lvitem, 'NOT SET')); CLOSE test_cur; END; /
下列的選項中哪些可用來代替 /*FETCH*/ 從而使得這個塊執行之后,屏幕上可以見到如下輸出?
Count = 2
Item = Mouse
(A)
FETCH test_cur INTO lvitem; lvitem := plch_getitem (test_cur);
SQL> DECLARE 2 lvitem plch_tab.item%TYPE; 3 test_cur SYS_REFCURSOR; 4 BEGIN 5 OPEN test_cur FOR 6 SELECT * FROM plch_tab ORDER BY item; 7 8 FETCH test_cur 9 INTO lvitem; 10 lvitem := plch_getitem(test_cur); 11 12 DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT); 13 DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET')); 14 15 CLOSE test_cur; 16 END; 17 / Count = 2 Item = Mouse PL/SQL procedure successfully completed SQL>
(B)
lvitem := plch_getitem (test_cur); lvitem := plch_getitem (test_cur);
SQL> DECLARE 2 lvitem plch_tab.item%TYPE; 3 test_cur SYS_REFCURSOR; 4 BEGIN 5 OPEN test_cur FOR 6 SELECT * FROM plch_tab ORDER BY item; 7 8 lvitem := plch_getitem(test_cur); 9 lvitem := plch_getitem(test_cur); 10 11 DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT); 12 DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET')); 13 14 CLOSE test_cur; 15 END; 16 / Count = 2 Item = Mouse PL/SQL procedure successfully completed SQL>
(C)
lvitem := plch_getitem (test_cur); FETCH test_cur INTO lvitem;
SQL> DECLARE 2 lvitem plch_tab.item%TYPE; 3 test_cur SYS_REFCURSOR; 4 BEGIN 5 OPEN test_cur FOR 6 SELECT * FROM plch_tab ORDER BY item; 7 8 lvitem := plch_getitem(test_cur); 9 FETCH test_cur 10 INTO lvitem; 11 12 DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT); 13 DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET')); 14 15 CLOSE test_cur; 16 END; 17 / Count = 2 Item = Mouse PL/SQL procedure successfully completed SQL>
(D)
lvitem := plch_getitem (test_cur); FETCH plch_cur INTO lvitem;
SQL> DECLARE 2 lvitem plch_tab.item%TYPE; 3 test_cur SYS_REFCURSOR; 4 BEGIN 5 OPEN test_cur FOR 6 SELECT * FROM plch_tab ORDER BY item; 7 8 lvitem := plch_getitem(test_cur); 9 FETCH plch_cur 10 INTO lvitem; 11 12 DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT); 13 DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET')); 14 15 CLOSE test_cur; 16 END; 17 / DECLARE lvitem plch_tab.item%TYPE; test_cur SYS_REFCURSOR; BEGIN OPEN test_cur FOR SELECT * FROM plch_tab ORDER BY item; lvitem := plch_getitem(test_cur); FETCH plch_cur INTO lvitem; DBMS_OUTPUT.put_line('Count = ' || test_cur%ROWCOUNT); DBMS_OUTPUT.put_line('Item = ' || NVL(lvitem, 'NOT SET')); CLOSE test_cur; END; ORA-06550: 第 9 行, 第 9 列: PLS-00201: 必須聲明標識符 'PLCH_CUR' ORA-06550: 第 9 行, 第 3 列: PL/SQL: SQL Statement ignored SQL>
答案ABC. 答案D錯誤因為plch_cur這個名稱在函數之外是不可見的。 REF CURSOR作為IN參數(不需要定義為IN OUT),在FETCH之后游標仍然會前移,所以你調用之后再FETCH會取到下一行。
感謝各位的閱讀,以上就是“SYS_REFCURSOR作為過程參數的表現是什么”的內容了,經過本文的學習后,相信大家對SYS_REFCURSOR作為過程參數的表現是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。