使用T-SQL(SQL Server)这可能不容易:
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 :(得分:2)
当您在问题中运行匿名PL / SQL块时,块编译并执行OK,但动态查询isn't actually being executed:
如果 dynamic_sql_statement 是SELECT语句,并且您省略了 into_clause 和 bulk_collect_into_clause ,那么 execute_immediate_statement 永远不会执行
如果您很高兴在脚本输出窗口中看到结果,您可以使用variable
和print
SQL Developer客户端命令,让您的块打开引用游标作为绑定变量:< / p>
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,但仅限于存储过程 - 而不是匿名块。您仍然只在脚本输出窗口中see the results(假设您的SQL Developer版本完全支持此机制)。
我认为没有办法将动态查询的结果从匿名块运行到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(或点击控制-F10)来运行该功能。这将为您提供一个窗口,其中包含预先填充的匿名块以调用该函数:
单击“确定”后,动态查询结果将最终出现在“输出变量”中。 section(在这种情况下使用针对employees表的查询):
该输出不像查询结果窗口那样灵活,但您不能将其导出或排序。但它是一个很好的网格......