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

这篇文章主要讲解了“SYS_REFCURSOR作为过程参数的表现是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SYS_REFCURSOR作为过程参数的表现是什么”吧!

创新互联长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为绿园企业提供专业的成都网站设计、网站制作,绿园网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

我创建了如下的表并填充数据:

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作为过程参数的表现是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


本文标题:SYS_REFCURSOR作为过程参数的表现是什么
URL标题:http://hbruida.cn/article/jeggdh.html