输出使用动态 PL/SQL 执行的 SELECT 的结果
Output the result of a SELECT executed using dynamic PL/SQL
使用 T-SQL(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;
有了这个,我可以在脚本输出 window 中得到一个 PL/SQL 过程成功完成。但是,与 T-SQL 中发生的情况不同,它在 'Query Result' window.
上没有给我任何结果
我已经尝试了此处提出的解决方案:How to output result of SELECT statement which is executed using native dynamic SQL?,但我仍然无法复制。无论如何,我相信这个解决方案试图在 'Script output' window 中输出结果。那不是我要寻找的。我想把结果输出到'Query Result'window.
当您 运行 问题中的匿名 PL/SQL 块时,该块编译并执行正常,但动态查询 isn't actually being executed:
If dynamic_sql_statement is a SELECT statement, and you omit both into_clause and bulk_collect_into_clause, then execute_immediate_statement never executes.
如果您很高兴只在脚本输出中看到结果 window 您可以使用 variable
和 print
SQL 开发者客户端命令并让您的块打开一个引用游标作为绑定变量:
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, but only from a stored procedure - not an anonymous block. You would still only see the results 在脚本输出 window 中(假设你的 SQL Developer 版本完全支持这种机制)。
我认为没有任何方法可以将匿名块中的动态查询 运行 的结果放入 SQL 开发人员查询结果 windows,因为 SQL 开发人员没有 运行 查询 - 它发生在服务器上的 PL/SQL 上下文中。
您可能会改用一个函数,returns 一个流水线集合,然后查询该函数 - 但必须事先知道集合类型,这限制了查询的真正动态程度因为 select 列表中的列名和数据类型必须与对象类型匹配。
很难说出建议是什么,因为您的示例不需要是动态的。现实世界的场景可能会建议其他方法。它仍然不是您想要的查询结果 window,但是如果您确实有这样的函数;
删除函数 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;
/
然后您可以从对象浏览器(在连接下,左侧窗格中)打开该函数。从那里您可以单击绿色三角形(或按 control-F10)以 运行 函数。这为您提供了一个 window 和一个预先填充的匿名块来调用该函数:
单击“确定”后,动态查询结果将出现在 'output variables' 部分(在本例中使用针对员工 table 的查询):
该输出不如查询结果灵活 window,例如,尽管您无法将其导出或排序。但它在一个漂亮的网格中...
使用 T-SQL(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;
有了这个,我可以在脚本输出 window 中得到一个 PL/SQL 过程成功完成。但是,与 T-SQL 中发生的情况不同,它在 'Query Result' window.
上没有给我任何结果我已经尝试了此处提出的解决方案:How to output result of SELECT statement which is executed using native dynamic SQL?,但我仍然无法复制。无论如何,我相信这个解决方案试图在 'Script output' window 中输出结果。那不是我要寻找的。我想把结果输出到'Query Result'window.
当您 运行 问题中的匿名 PL/SQL 块时,该块编译并执行正常,但动态查询 isn't actually being executed:
If dynamic_sql_statement is a SELECT statement, and you omit both into_clause and bulk_collect_into_clause, then execute_immediate_statement never executes.
如果您很高兴只在脚本输出中看到结果 window 您可以使用 variable
和 print
SQL 开发者客户端命令并让您的块打开一个引用游标作为绑定变量:
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, but only from a stored procedure - not an anonymous block. You would still only see the results 在脚本输出 window 中(假设你的 SQL Developer 版本完全支持这种机制)。
我认为没有任何方法可以将匿名块中的动态查询 运行 的结果放入 SQL 开发人员查询结果 windows,因为 SQL 开发人员没有 运行 查询 - 它发生在服务器上的 PL/SQL 上下文中。
您可能会改用一个函数,returns 一个流水线集合,然后查询该函数 - 但必须事先知道集合类型,这限制了查询的真正动态程度因为 select 列表中的列名和数据类型必须与对象类型匹配。
很难说出建议是什么,因为您的示例不需要是动态的。现实世界的场景可能会建议其他方法。它仍然不是您想要的查询结果 window,但是如果您确实有这样的函数;
删除函数 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;
/
然后您可以从对象浏览器(在连接下,左侧窗格中)打开该函数。从那里您可以单击绿色三角形(或按 control-F10)以 运行 函数。这为您提供了一个 window 和一个预先填充的匿名块来调用该函数:
单击“确定”后,动态查询结果将出现在 'output variables' 部分(在本例中使用针对员工 table 的查询):
该输出不如查询结果灵活 window,例如,尽管您无法将其导出或排序。但它在一个漂亮的网格中...