0

平台:Oracle
语言:PL/SQL
问题:想要将过程 OUT 游标输出到 SQLDeveloper SQLWosksheet。

任何人都知道如何使用 Oracle“Select * from Table(PipelinedFunction(Param))”来检查过程代码输出游标?

我正在使用 Oracle 存储过程的 Crsytal Reports。Crystal 要求一个过程返回一个游标,它会获取并读取该游标。

我拥有的程序代码目前正在工作,但我想找到最简单的方法来查看程序代码更改的效果。我有可用的 SQLDeveloper,我正在其中进行创建和 sql 测试。我想在 SQL Developer 查询结果窗口(“SQL 工作表”)中快速获得可见的结果。

有没有一种(简单的)方法可以使用函数从过程中读取光标?(并将其输出到 Table 函数?)

很复杂,我知道,但是当我能看到代码更改的结果时,我处理得最好。如果我可以直接查看记录结果,将加快报告的开发速度。

我知道 Table 函数和一点关于 Oracle 中的流水线的知识。我对一般游标和 sys_refcursor 了解一些。我非常了解类型以及我为什么需要它们。(难道 sys_regCursor 不应该让我们摆脱这种情况吗?)

当前过程执行了一系列适当但不优雅的查询、插入到全局临时表 (GTT)、从 GTT 和原始表连接、更多插入和更多自连接,然后将结果选择到 OUT 游标中。仅依靠游标等我可能会做得更好,但是当前的方法足以获得报告的结果。

我认为我可以很好地处理 SQL(出于我们的目的),但我不是特定于 Oracle 的开发人员......但我需要帮助。

有人遇到过这个吗?整个想法是加快程序代码的开发速度,但我花了几天时间寻找一种方法来获得输出……这不是我的想法。

更新:
我已经尝试了一些基于我在网上看到的条子的愚蠢方案......例如

Create or replace FUNCTION GET_BACKPLANE (
   Node VARCHAR2 ) RETURN SYS_REFCURSOR
AS

RESULTS SYS_REFCURSOR;

BEGIN
    Open Results for
        Select Backplane(Results, Node) from Dual ;
    ... etc.

Create or replace Function GET_BACKPLANE ( 
    NODE VARCHAR2 )  RETURN  My_Table_Stru%ROWTYPE  PIPELINED
AS

BEGIN ...

我认为 Oracle 甚至没有考虑让我重新引用过程中的输出游标(“结果”是一个 sys_refcursor,它保存过程中最后一个 SELECT 的结果)。我不知道如何定义它,打开它,并从过程中引用它。

我从来没有到过我可以尝试的地方

SELECT * FROM TABLE(GET_BACKPLANE( ... etc )

抱歉,有任何错别字和糟糕的 Oracle 语法……已经好几天了。

4

2 回答 2

3

SQL Developer 允许我们在 Worksheet 中使用 SQL*Plus 命令。所以你需要做的就是定义一个变量来保存引用游标的输出。

我可能误解了您要运行的实际代码,但我假设您的实际程序是一个过程Backplane(Results, Node),其中results数据类型为 sys_refcursor 的 OUT 参数node是一些输入参数。

var rc refcursor

exec  Backplane(results=>:rc, Node=>42) 

print rc

语句的输出print被写入脚本输出窗格。

请注意,使用 SQL*Plus 命令意味着我们必须使用 Run Script 选项F5而不是执行语句。

于 2010-10-07T05:27:20.970 回答
0

谢谢您的帮助。最后,我对它进行了暴力破解……一步一步:进行查询,测试查询,从结构中创建一个全局临时表,添加代码以从该 GTT 进行另一个查询,测试查询,从结构创建全局临时表等。

最后,我最终运行(匿名块)脚本并在每个阶段检查 GTT 内容。

最后一部分是使用原始过程中相同的最后一个查询,将所有内容填充到水晶喜欢的光标中......

明天,我测试一下。

但是,我会在下一个程序中强制完成,并在一天半内完成,而不是 2 周以上(尴尬)。

谢谢,

马克

于 2010-10-08T02:14:45.293 回答