共計 3394 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章主要講解了“SYS_REFCURSOR 作為過程參數的表現是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“SYS_REFCURSOR 作為過程參數的表現是什么”吧!
我創建了如下的表并填充數據:
CREATE TABLE plch_tab (item VARCHAR2 (10))
BEGIN
INSERT INTO plch_tab
VALUES ( Keyboard
INSERT INTO plch_tab
VALUES ( Mouse
COMMIT;
/
然后我創建了這個函數,從游標變量取得一行數據并返回:
CREATE OR REPLACE FUNCTION plch_getitem ( plch_cur IN SYS_REFCURSOR)
RETURN plch_tab.item%TYPE
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;
/
下列的選項中哪些可用來代替 /*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;
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 作為過程參數的表現是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!
正文完