2017-04-06 81 views
0

使用T-SQL(SQL Server)的,这可能不容易执行的结果是:输出一个SELECT的使用动态PL/SQL

DECLARE @MyStatement AS NVARCHAR(max) = 'SELECT * FROM MYTABLE' 
EXEC (@MyStatement) 

但是,使用PL/SQL(Oracle)的它是一个真正的在屁股疼痛。几个小时后,我终于可以达到的东西,已成功完成且没有错误:

declare 
    MyStatement varchar(300) := 'SELECT * FROM MYTABLE'; 
begin 
    execute immediate MyStatement; 
end; 

有了这个,我可以得到顺利完成脚本输出窗口PL/SQL程序。但是,与T-SQL中发生的不同,它不会在“查询结果”窗口中给出任何结果。

我试过这里提出的解决方案:How to output result of SELECT statement which is executed using native dynamic SQL?,我仍然无法复制。无论如何,我相信这个解决方案试图在'脚本输出'窗口中输出结果。这不是我正在寻找的。我想在“查询结果”窗口中输出结果。

+0

PL/SQL块在服务器上执行,无法直接输出到客户端的查询结果窗口。在脚本输出中是否有你不想要的原因(顺便说一句,这可以比答案更容易完成)?您需要跳过更多的箍环才能将其加入查询结果中。 –

回答

2

当你运行你的问题的匿名PL/SQL块的块编译和执行OK,但动态查询isn't actually being executed

如果dynamic_sql_statement是一个SELECT语句,你省略这两个into_clausebulk_collect_into_clause,然后execute_immediate_statement从不执行。

如果你很高兴刚才看到的结果在脚本输出窗口,你可以使用variableprint SQL Developer的客户端命令,让你的块打开一个REF CURSOR作为绑定变量:

var rc refcursor 

declare 
    MyStatement varchar(300) := 'SELECT * FROM MYTABLE'; 
begin 
    open :rc for MyStatement; 
end; 
/

print rc 

绑定光标方法可以从其他客户端使用,例如来自使用JDBC的Java应用程序。和12c adds a mechanism to simplify that a bit,但只能从存储过程 - 不是匿名块。尽管(尽管您的SQL Developer版本支持这种机制),但脚本输出窗口中仍然只有see the results

我不认为有什么办法可以从SQL Developer查询结果窗口中的匿名块中运行动态查询得到结果,因为SQL Developer没有运行查询 - 它发生在PL/SQL内部上下文在服务器上。

您可能会使用函数来代替返回流水线集合,然后查询该函数 - 但事先必须知道集合类型,这会限制查询的真实动态方式,因为列名称和选择列表中的数据类型必须与对象类型匹配。

很难说出什么建议,因为您的示例不需要是动态的。现实世界的情景可能会提出其他方法。它仍然不是你想要的查询结果窗口,但是如果你确实有这样的功能;

drop function myfunc;

create function myfunc return sys_refcursor 
as 
    MyStatement varchar(300) := 'SELECT * FROM MYTABLE'; 
    MyRefCursor sys_refcursor; 
begin 
    open MyRefCursor for MyStatement; 
    return MyRefCursor; 
end; 
/

然后你可以从对象浏览器(在连接下,在左边的窗格中)打开函数。从那里你可以点击绿色的triange(或点击control-F10)来运行该功能。这就给了你一个预填充匿名块窗口调用的函数:

enter image description here

当您单击确定动态查询结果将显示在“输出变量”部分结束了(使用针对该查询在这种情况下,员工表):

enter image description here

,虽然不能导出,或对其进行排序,例如输出还不如查询结果窗口灵活。但它在一个很好的网格中...