快速脏结果:在SQL工作表中查看过程OUT游标的结果?

时间:2010-10-07 00:55:59

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

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

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

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

我的程序代码目前正在运行,但我想找到查看程序代码更改效果的最简单方法。我有SQLDeveloper可用,我正在进行创建和SQL测试。我想在SQL Developer Query Result窗口(“SQL Worksheet”)中看到一个快速结果。

是否有(简单)方法使用Function从过程中读取游标? (以及表格函数的管道?)

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

我知道Table函数和Oracle中的流水线技术。我对一般的游标和sys_refcursor有一点了解。我知道类型和我为什么需要它们。 (不是sys_regCursor应该让我们远离那个吗?)

当前过程执行了一系列足够但非常多的查询,插入到全局临时表(GTT),从GTT和原始表连接,更多插入以及更多自连接,然后将结果选择到OUT游标中。我可能能够更好地依赖游标等,但目前的方法足以让结果得到报告。

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

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

更新:
  我已经尝试了一些基于我在网上看到的条子的hare-brained方案......比如

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甚至不考虑让我从过程中重新引用输出游标(“Results”是一个sys_refcursor,它保存过程中最后一个SELECT的结果)。我不知道如何定义它,打开它,并从程序中引用它。

我从未到过可以尝试的地方

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

对于任何拼写错误以及糟糕的Oracle语法而言,对不起......已经有好几天了。

2 个答案:

答案 0 :(得分:3)

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

我可能误解了您要运行的实际代码,但我假设您的实际程序是一个过程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 而不是执行语句。

答案 1 :(得分:0)

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

最后,我结束了运行(匿名阻止)脚本并在每个阶段检查GTT内容。

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

明天,我测试一下。

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

谢谢,

马克