当前位置: 首页 > 面试题库 >

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

姬朗
2023-03-14
问题内容

我的包体内有一个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(有时对于原型设计很有用,但生产代码不应该依赖该数据),则可以执行以下操作

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



 类似资料:
  • 问题内容: 我使用Spring 3.0.5开发Java应用程序,并使用mybatis-spring处理数据库Oracle。 我有一个用于mybatis的界面: } canCustomerSubscribe的mybatis xml内容: 和要执行的代码: 当我使用无效的“ msisdn”执行“订阅”方法时,我没有从过程中收到实际的输出值。在数据库中执行此过程将返回reponseValue = 100

  • 我一直试图使用Hibernate执行Oracle存储过程。这不是用于生产,而是用于我正在研究的Java源代码解析项目。简单地说,我不能从Oracle存储过程返回值。 我搜索并阅读了SO、Hibernate Community/Documentations(原生SQL章节)链接中的所有相关链接,并尝试了这些建议,但不知何故无法让它们发挥作用。以下是我的来源--我只包括相关的部分。

  • 问题内容: 我在用Java执行需要参数的批处理文件时遇到困难。这些参数可能包含空格,因此我需要将它们用引号引起来。对于Linux,我还将需要做同样的事情,因为某些参数可能包含特殊字符,例如。 非功能性Windows程式码: 非功能性Linux程式码: 我知道我应该像下面的Windows示例一样添加参数,但这不适用于空格: 应该怎么做? 问题答案: 视窗: Unix:

  • 问题内容: 我正在尝试使用Oracle 11g(在开发中为11.1,在生产中为11.2)进行数值分析,特别是在具有三列感兴趣的表的表上进行线性插值:时间戳,设备ID和值。 值列保存来自设备的数据(标识为deviceid),该数据是在时间戳记中指定的时间获取的。例如,这是伪数据,但是它给出了这样的想法: 来自设备001的时间戳与设备002的时间戳不匹配,但是我需要将来自设备001和002的值放在一行

  • 问题内容: 在我的我确定,我可以在命令行后使用的功能: 使用此命令时,仅在远程主机上执行该命令。该命令在本地主机上执行。这是因为分号将两个不同的命令分开:命令和命令。 我尝试如下定义函数(注意单引号): 我试图将命令和命令放在一起,但是参数解析不取决于我给函数的内容。总是试图执行命令 在远程主机上。 如何正确定义,所以剧本正在改变进入目录后,在远程主机上执行,具有传递给参数的能力来? 问题答案: