Oracle SQL 开发人员 - 显示查询结果的脚本输出
Oracle SQL Developer - Script Output with Query result displayed
无法取回 PL/SQL 脚本的查询结果。它在下午早些时候运行良好,但可能出了点问题,现在结果已经从屏幕上消失了。我应该怎么办?
谢谢!
虚拟查询只是一个示例,即使我还应该将 DUMMY 作为列 header 并将 X 作为“查询结果”选项卡中的唯一记录。事实上,我的脚本如下所示并且有效但没有提供可见数据,因为“查询结果”已经消失。在重新安装 Oracle SQL Dev 之前,我想知道是否存在解决这一点的技巧,到目前为止我还没有发现任何有价值的修复。
declare
v_tab varchar( 30 ):= 'MD_ALL_DETAIL_';
v_date1 varchar( 30 ):= '0827D';
v_date2 varchar( 30 ):= '0830';
v_tab1 varchar( 30 );
v_tab2 varchar( 30 );
v_sql varchar( 2000 );
begin
v_tab1 := v_tab || v_date1;
v_tab2 := v_tab || v_date2;
v_sql := '
with tab as(
select ' || v_date1 || ' flag, md1.*
from ' || v_tab1 || ' md1
union all
select ' || v_date2 || ' flag, md2.*
from ' || v_tab2 || ' md2
), tab2 as (
select *
from(
select tab.flag, tab.cat_mk_code, tab.cat_mk_iden, tab.b_entity_code, tab.b_entity_iden, tab.cat_be_code, tab.cat_be_iden, tab.bucket_code, tab.
bucket_iden, tab.m_entity_code, tab.application_code, tab.indicator_code, tab.indicator_iden, tab.measure_value, tab.user_code, tab.lock_flag,
tab.alter_date, tab.table_name
from tab
)pivot(
sum( measure_value )
for flag
in( ' || v_date1 || ' as MEASURE_0, ' || v_date2 || ' as MEASURE_1 )
) )
select * from tab2 where MEASURE_0<>MEASURE_1';
execute immediate v_sql;
end;'
此代码(在屏幕截图中)不执行任何操作,因此您收到的消息(“PL/SQL 程序已成功完成”)就是您所期望的。
运行 例如
select * from dual;
和SQL开发者会自动打开缺失“查询结果”选项卡。
如果你想“显示”动态 SQL 的结果,你必须 select 它 到 东西。一个简单的例子:
看到了吗?我 select 来自 DUAL
(正如您最初的查询所做的那样)INTO
一个局部变量。结果显示在 脚本输出 选项卡中。
您的“新”代码使用更复杂的查询,可能返回多个 column/row,因此您不能 select 到标量变量中。我假设您必须创建一个 TYPE
,声明一个局部变量(可能是一个集合),然后对结果执行 某事。
https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#LNPLS01317
如果 dynamic_sql_statement 是一个 SELECT 语句,并且您省略了 into_clause 和 bulk_collect_into_clause,那么 execute_immediate_statement 永远不会执行。
例如,此语句从不递增序列:
立即执行'SELECT S.NEXTVAL FROM DUAL'
无法取回 PL/SQL 脚本的查询结果。它在下午早些时候运行良好,但可能出了点问题,现在结果已经从屏幕上消失了。我应该怎么办? 谢谢!
虚拟查询只是一个示例,即使我还应该将 DUMMY 作为列 header 并将 X 作为“查询结果”选项卡中的唯一记录。事实上,我的脚本如下所示并且有效但没有提供可见数据,因为“查询结果”已经消失。在重新安装 Oracle SQL Dev 之前,我想知道是否存在解决这一点的技巧,到目前为止我还没有发现任何有价值的修复。
declare
v_tab varchar( 30 ):= 'MD_ALL_DETAIL_';
v_date1 varchar( 30 ):= '0827D';
v_date2 varchar( 30 ):= '0830';
v_tab1 varchar( 30 );
v_tab2 varchar( 30 );
v_sql varchar( 2000 );
begin
v_tab1 := v_tab || v_date1;
v_tab2 := v_tab || v_date2;
v_sql := '
with tab as(
select ' || v_date1 || ' flag, md1.*
from ' || v_tab1 || ' md1
union all
select ' || v_date2 || ' flag, md2.*
from ' || v_tab2 || ' md2
), tab2 as (
select *
from(
select tab.flag, tab.cat_mk_code, tab.cat_mk_iden, tab.b_entity_code, tab.b_entity_iden, tab.cat_be_code, tab.cat_be_iden, tab.bucket_code, tab.
bucket_iden, tab.m_entity_code, tab.application_code, tab.indicator_code, tab.indicator_iden, tab.measure_value, tab.user_code, tab.lock_flag,
tab.alter_date, tab.table_name
from tab
)pivot(
sum( measure_value )
for flag
in( ' || v_date1 || ' as MEASURE_0, ' || v_date2 || ' as MEASURE_1 )
) )
select * from tab2 where MEASURE_0<>MEASURE_1';
execute immediate v_sql;
end;'
此代码(在屏幕截图中)不执行任何操作,因此您收到的消息(“PL/SQL 程序已成功完成”)就是您所期望的。
运行 例如
select * from dual;
和SQL开发者会自动打开缺失“查询结果”选项卡。
如果你想“显示”动态 SQL 的结果,你必须 select 它 到 东西。一个简单的例子:
看到了吗?我 select 来自 DUAL
(正如您最初的查询所做的那样)INTO
一个局部变量。结果显示在 脚本输出 选项卡中。
您的“新”代码使用更复杂的查询,可能返回多个 column/row,因此您不能 select 到标量变量中。我假设您必须创建一个 TYPE
,声明一个局部变量(可能是一个集合),然后对结果执行 某事。
https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#LNPLS01317
如果 dynamic_sql_statement 是一个 SELECT 语句,并且您省略了 into_clause 和 bulk_collect_into_clause,那么 execute_immediate_statement 永远不会执行。 例如,此语句从不递增序列:
立即执行'SELECT S.NEXTVAL FROM DUAL'