输出使用动态 PL/SQL 执行的 SELECT 的结果

Lui*_*eia 2 t-sql sql-server oracle plsql dynamicquery

使用 T-SQL (SQL Server) 这再简单不过了:

DECLARE @MyStatement AS NVARCHAR(max) = 'SELECT * FROM MYTABLE'
EXEC (@MyStatement)
Run Code Online (Sandbox Code Playgroud)

然而,使用 PL/SQL (Oracle) 确实很痛苦。几个小时后,我终于可以成功完成并且没有错误的事情:

declare 
    MyStatement varchar(300) := 'SELECT * FROM MYTABLE';
begin
    execute immediate MyStatement;
end;
Run Code Online (Sandbox Code Playgroud)

这样我就可以在脚本输出窗口中成功完成 PL/SQL 过程。然而,与 T-SQL 中发生的情况不同,它不会在“查询结果”窗口中提供任何结果。

我已经尝试过这里提出的解决方案:How to Output result of SELECT statements which isexecd using nativedynamic SQL? ,我仍然无法复制。无论如何,我相信这个解决方案正在尝试在“脚本输出”窗口中输出结果。那不是我要寻找的。我想在“查询结果”窗口中输出结果。

Ale*_*ole 5

当您在问题中运行匿名 PL/SQL 块时,该块编译并执行正常,但动态查询实际上并未执行

如果dynamic_sql_statement是一个SELECT语句,并且您省略了into_clausebulk_collect_into_clause,则execute_immediate_statement永远不会执行。

如果您很高兴在脚本输出窗口中看到结果,您可以使用variableSQL printDeveloper 客户端命令并让您的块打开引用游标作为绑定变量:

var rc refcursor

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

print rc
Run Code Online (Sandbox Code Playgroud)

该绑定游标方法可以从其他客户端使用,例如从使用 JDBC 的 Java 应用程序。12c添加了一种机制来简化这一点,但仅限于存储过程 - 而不是匿名块。不过,您仍然只能在脚本输出窗口中看到结果(假设您的 SQL Developer 版本完全支持此机制)。

我认为没有任何方法可以将在匿名块中运行的动态查询的结果获取到 SQL Developer 查询结果窗口中,因为 SQL Developer 没有运行查询 - 它发生在服务器上的 PL/SQL 上下文中。

您可以使用一个函数来代替,该函数返回一个管道集合,然后查询该函数 - 但必须提前知道集合类型,这限制了查询的动态程度,因为查询中的列名和数据类型选择列表必须与对象类型匹配。

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

删除函数 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;
/
Run Code Online (Sandbox Code Playgroud)

然后您可以从对象浏览器打开该功能(在连接下,在左侧的窗格中)。从那里您可以单击绿色三角形(或按 Control-F10)来运行该函数。这将为您提供一个带有预先填充的匿名块的窗口来调用该函数:

在此输入图像描述

当您单击“确定”时,动态查询结果将最终出现在“输出变量”部分中(在本例中使用针对员工表的查询):

在此输入图像描述

例如,该输出不如查询结果窗口灵活,尽管您无法导出它或对其进行排序。但它在一个很好的网格中......