您可以相对轻松地执行该过程
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"
每次调用时都必须用双引号将标识符引起来,这已经很老了。除非您真的有令人信服的理由,否则建议您使用标准的不区分大小写的标识符。在代码中合理地大写标识符是完全合理的,当然,在数据字典中强制将它们区分大小写只是没有多大意义。