平台: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语法而言,对不起......已经有好几天了。
答案 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中......
明天,我测试一下。但是,我会强制它完成下一个程序,并在一天半而不是两周以上完成(尴尬)。
谢谢,
马克