我的包体内有一个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_output(有时对于原型设计很有用,但生产代码不应该依赖该数据),则可以执行以下操作
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而不是一个游标。强制调用者确切知道要声明的类型,并希望过程中的查询不变。这还要求您显式编写代码以显示令人讨厌的数据。
%rowtype
如果您使用的是SQL * Plus(或支持某些SQL * Plus命令的东西),则可以简化一些操作
VARIABLE rc REFCURSOR; EXEC mypackage."GetAllRules"( :rc ); PRINT :rc;
顺便说一句,我不喜欢使用区分大小写的标识符。"GetAllRules"每次调用时都必须用双引号将标识符引起来,这已经很老了。除非您真的有令人信服的理由,否则建议您使用标准的不区分大小写的标识符。在代码中合理地大写标识符是完全合理的,当然,在数据字典中强制将它们区分大小写只是没有多大意义。
"GetAllRules"