Sql 如何使用out sys\u refcursor参数执行oracle过程?

Sql 如何使用out sys\u refcursor参数执行oracle过程?,sql,oracle,plsql,Sql,Oracle,Plsql,我的包正文中有一个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 S

我的包正文中有一个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窗口中执行此过程?

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

DECLARE 
  l_rc sys_refcursor;
BEGIN
  mypackage."GetAllRules"( l_rc );
END;
当然,这只是将光标返回给调用应用程序。它不做任何事情来从游标中获取数据、处理数据或关闭游标。假设您的目标是将一些数据写入
dbms\u输出
(这有时对原型设计很有用,但不是生产代码应该依赖的东西),您可以执行以下操作

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;

另外,我不喜欢使用区分大小写的标识符。每次调用时都必须用双引号将标识符(如
“GetAllRules”
)括起来,这变得非常陈旧。除非您有令人信服的理由,否则我建议使用标准的不区分大小写的标识符。在代码中合理地将标识符大写是完全合理的,当然,在数据字典中强制标识符区分大小写是没有多大意义的。

谢谢-这回答了我所有的问题和更多问题。感谢提示:区分大小写的标识符。我是Oracle的新手,PL SQL Dev为我生成了这个。我会调整的。
VARIABLE rc REFCURSOR;
EXEC mypackage."GetAllRules"( :rc );
PRINT :rc;