在PLSQL过程中获取输出

时间:2015-11-03 13:20:39

标签: sql oracle plsql oracle-sqldeveloper

通常情况下,在SQL Developer中,如果使用INSERT语句,那么Script output中就会有一个输出:

insert into a (a) values (1);

1 rows inserted.

然后,如果我们将其编译成过程:

create or replace procedure testp as
begin
  insert into a (a) values (1);
end;

PROCEDURE TESTP compiled

并拨打电话:

execute testp

anonymous block completed

没有关于插入了多少行的输出。那么,我们可以在程序中打开详细输出吗?

3 个答案:

答案 0 :(得分:3)

如果您只是想要"详细输出"对于在启用了适当设置的IDE中以交互方式运行过程的用户,将打印出来,

create or replace procedure testp as
begin
  insert into a (a) values (1);
  dbms_output.put_line( sql%rowcount || ' row inserted. ' );
end;

假设调用者正在使用知道如何显示写入dbms_output(即IDE)的内容的应用程序,他们已启用dbms_output(使用dbms_output在SQL Developer中的窗口),他们已经分配了足够的缓冲区等,调用者将看到" 1行插入" (如果要以编程方式处理单数/复数的语法,可以添加更多代码)。

为什么你想要那种输出呢?这通常意味着您应该对某种日志表进行一些真正的日志记录,而不是希望交互式用户正在运行您的代码并查看输出。

答案 1 :(得分:1)

  

没有关于插入了多少行的输出。那么,我们可以在程序中打开详细输出吗?

SQL和PL / SQL不一样。在PL / SQL中,您可以使用 SQL%ROWCOUNT 来获取受 DML 影响的总行数。

要在输出缓冲区中获取此信息,请使用 DBMS_OUTPUT.PUT_LINE

例如,

DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' rows were inserted' );

确保在客户端中启用DBMS_OUTPUT。

SQL * Plus 中,执行:

set serveroutput on

其他基于GUI的客户端工具可以选择启用它。

我不建议在生产中使用DBMS_OUTPUT。您可以将它用于记录目的。就像您希望每天记录受程序影响的行数一样。

答案 2 :(得分:1)

我建议不要使用dbms_output尝试合并OUT参数并将SQL%ROWCOUNT分配给此变量。将dbms_output保留在prod env中是一个非常糟糕的主意。

create or replace procedure testp
(p_row_cnt_out OUT PLS_INTEGER)
 as
begin
  insert into a (a) values (1);
  p_row_cnt_out:= SQL%ROWCOUNT;
  --dbms_output.put_line( sql%rowcount || ' row inserted. ' );
end;