千家信息网

SYS_REFCURSOR作为过程参数的表现是什么

发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,这篇文章主要讲解了"SYS_REFCURSOR作为过程参数的表现是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SYS_REFCURSOR作为过程
千家信息网最后更新 2025年01月27日SYS_REFCURSOR作为过程参数的表现是什么

这篇文章主要讲解了"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%TYPEIS   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 = 2Item = MousePL/SQL procedure successfully completedSQL>

(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 = 2Item = MousePL/SQL procedure successfully completedSQL>

(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 = 2Item = MousePL/SQL procedure successfully completedSQL>

(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 ignoredSQL>
答案ABC. 答案D错误因为plch_cur这个名称在函数之外是不可见的。REF CURSOR作为IN参数(不需要定义为IN OUT),在FETCH之后游标仍然会前移,所以你调用之后再FETCH会取到下一行。

感谢各位的阅读,以上就是"SYS_REFCURSOR作为过程参数的表现是什么"的内容了,经过本文的学习后,相信大家对SYS_REFCURSOR作为过程参数的表现是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0