【问题标题】:Oracle 11g - sys_refcursorOracle 11g - sys_refcursor
【发布时间】:2016-10-25 18:02:54
【问题描述】:

我正在开发一个以 Oracle 11g 为后端数据库的系统。 我对数据库的权限非常有限,因此我所能做的就是调用位于包中的过程。

通常,这些过程通过 sys_refcursor 类型的 OUT 参数返回其结果集。

我可以在 C# 中很好地调用它们,并通过 C# OracleDataset 类型从游标中获取数据。

这是我的问题。 我希望能够运行这些程序并通过 SQL Developer 查看结果。 我可以很好地执行该过程,但是看到 sys_refcursor OUT 参数的内容让我大吃一惊。

我做了一些搜索,人们说创建类型和其他解决方案我根本没有权限去说服。

那么,我怎么可能看到包含在 sys_refcursor 中的结果集呢? 所以说我有一个带有这个签名的程序......

procedure an_oracle_Proc(p_ref         IN  varchar2,
                         p_result_set  OUT sys_refcursor);

我这样称呼它......

DECLARE
  l_ref VARCHAR2(10);
  l_result_set sys_refcursor;
BEGIN
  oracle_pkg.an_oracle_Proc(p_ref => l_ref,
                                          p_result_set => l_result_set);

  --How to select from l_result_set with limited permissions
END     

如何查看 l_result_Set 的内容?

【问题讨论】:

    标签: oracle stored-procedures oracle-sqldeveloper sys-refcursor


    【解决方案1】:

    这实际上是重复我之前链接的答案,但专门针对您的代码:

    VARIABLE result_set refcursor;
    
    DECLARE
      l_ref VARCHAR2(10);  
    BEGIN
      l_ref := 'whatever';
      oracle_pkg.an_oracle_Proc(p_ref => l_ref,
                                              p_result_set => :result_set);
    END;
    /
    
    PRINT result_set
    

    ... 并将所有这些作为 SQL 工作表中的脚本运行。引用光标的内容将显示在脚本输出窗口中。

    【讨论】:

    • 感谢亚历克斯,感谢您的时间和耐心。正如我所说 - 这是基本的
    【解决方案2】:

    我想再看一看,发现了这个——离开电脑能做的事情真是太神奇了。 ;) 我只需要在左侧窗格中选择适当的变量。

    http://www.thatjeffsmith.com/archive/2011/12/sql-developer-tip-viewing-refcursor-output/

    仍然 - 编写我自己的 SQL 来执行此操作而不是使用执行窗口会很好。

    【讨论】:

    • 你的意思是like this?还是要在 PL/SQL 中遍历游标行?
    • 打印在 SQL Developer 中不可用 :( 另外,在我实际运行它之前,我通常不知道要返回哪些列。我知道我知道,但它是一个权限问题。在黑暗中编码
    • Print 在 SQL Developer 中是绝对可用的,它会打印到脚本输出窗口中。 (至少回到第 3 版;不确定数据库附带的 1.x 版本;您的回答仅适用于我相信的更高版本)。该答案专门针对 SQL Developer。您链接到的文章甚至提到了它,但 Jeff 似乎更喜欢使用输出窗口。
    • 我一定是错过了一个技巧。那么,在 SQL Developer 中使用工作表(版本 4.1.3.20)......如何调用具有 SYS_REFCURSOR OUT 参数的 proc,然后打印该游标的内容?我已经尝试了太多的事情要在这里提及,但没有任何乐趣。很可能我错过了一些完全基本的东西:(我只是单击“新 SQL 工作表”btn 并将我的 SQL 放在那里并点击“运行脚本”.....
    • 这正是链接答案正在做的事情。你有一个绑定variable(在匿名 PL/SQL 块之外声明);您在匿名块中将其用作 proc 的 OUT 参数;然后在 PL/SQL 块之后使用print
    【解决方案3】:

    Sys_refcursor 形成一个匿名块有点棘手。使用sql-developer,探索包或过程,右键执行过程/包。

    Sql-developer 将打开一个输入/输出 UI,您可以在其中键入值。您还可以在同一个 UI 上看到输出。如果您需要更多详细信息,请告诉我。实际上,我在几周前成功地调试了同样的东西。

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 2012-05-26
      • 2017-08-18
      • 2010-10-12
      • 2016-01-02
      相关资源
      最近更新 更多