您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

Oracle 2022/1/1 18:41:34 有319人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶