PLSQL:在存储过程中使用动态查询时不显示输出

时间:2016-03-10 11:49:54

标签: oracle11g

我被要求创建一个创建临时表并插入一些记录的SP。

我正在为下面提到的相同的代码准备一些示例代码,但不显示输出。

create or replace procedure Test
is 
   stmt varchar2(1000);
   stmt2 varchar2(1000);
begin
    stmt := 'create global temporary table temp_1(id number(10))';
    execute immediate stmt;
    insert into temp_1(id) values (10);
    execute immediate 'Select * from temp_1';
    execute immediate 'Drop table temp_1';
    commit;
end;

当我通过(Exec Test)执行SP时,不显示所需的O / P.

我期待显示“选择*来自temp_1”的O / P.但它没有发生。请说明我做错了。

1 个答案:

答案 0 :(得分:3)

  

但我很有兴趣知道为什么(立即执行'选择*来自temp_1';)不会产生任何结果

有两个原因。首先是因为@a_horse_with_no_name表示PL / SQL不会显示查询结果。但更重要的是,在这里,查询永远不会被实际执行。此行为是stated in the documentation

  

如果 dynamic_sql_statement 是SELECT语句,并且您省略了 into_clause bulk_collect_into_clause ,那么* execute_immediate_statement(从不执行。

如果真实场景有多行,则必须立即执行变量,或者更可能是集合,然后处理该数据 - 在批量情况下迭代集合。

没有一种可靠的方式来显示PL / SQL中的任何内容;您可以使用dbms_output,但它比实际输出更适合调试,并且您通常无法保证客户端将配置为显示您放入其缓冲区的任何内容。

这完全是学术性的,因为在飞行中创建和删除GTT并不是一个好主意,并且有更好的方法来完成你想做的任何事情。

你所展示的街区根本不应该运行;当您动态创建temp_1时,静态SQL insert into temp_1将会出错,因为在编译块时该表尚不存在。插入物也必须是动态的。任何动态SQL都是一个警告信号,你可能会做错事,尽管有时是必要的;必须做所有动态建议整个方法需要重新思考,就像在运行时创建对象一样。