小编典典

如何使用out sys_refcursor参数执行oracle过程?

sql

我的包体内有一个proc:

create or replace package body MYPACKAGE is

    procedure "GetAllRules"(p_rules     out sys_refcursor)
    is
    begin
        open p_rules for
        select * from my_rules;

    end "GetAllRules";

-- etc

我在包装规格中公开了这一点。

如何在PL SQL Developer(或类似版本)的新SQL窗口中执行此过程?


阅读 316

收藏
2021-04-28

共1个答案

小编典典

您可以相对轻松地执行该过程

DECLARE 
  l_rc sys_refcursor;
BEGIN
  mypackage."GetAllRules"( l_rc );
END;

当然,这只是将游标返回到调用应用程序。它不执行任何操作来从游标中获取数据,对该数据执行任何操作或关闭游标。假设您的目标是向其中写入一些数据dbms_output(有时对于原型设计很有用,但生产代码不应该依赖该数据),则可以执行以下操作

DECLARE 
  l_rc sys_refcursor;
  l_rec my_rules%rowtype;
BEGIN
  mypackage."GetAllRules"( l_rc );
  LOOP
     FETCH l_rc INTO l_rec;
     EXIT WHEN l_rc%NOTFOUND;

     dbms_output.put_line( <<print data from l_rec>> );
   END LOOP;

   CLOSE l_rc;
END;

如果您确实在PL /
SQL中使用游标执行了这样的操作,我强烈建议您返回一个强类型的ref游标,而不是弱类型的ref游标,以便您可以用游标的形式声明一条记录,%rowtype而不是一个游标。强制调用者确切知道要声明的类型,并希望过程中的查询不变。这还要求您显式编写代码以显示令人讨厌的数据。

如果您使用的是SQL * Plus(或支持某些SQL * Plus命令的东西),则可以简化一些操作

VARIABLE rc REFCURSOR;
EXEC mypackage."GetAllRules"( :rc );
PRINT :rc;

顺便说一句,我不喜欢使用区分大小写的标识符。"GetAllRules"每次调用时都必须用双引号将标识符引起来,这已经很老了。除非您真的有令人信服的理由,否则建议您使用标准的不区分大小写的标识符。在代码中合理地大写标识符是完全合理的,当然,在数据字典中强制将它们区分大小写只是没有多大意义。

2021-04-28