在 PLSQL 过程中获取输出

Getting output in PLSQL procedure

通常,在 SQL 开发人员中,如果有人这样做,比方说,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

没有关于插入了多少行的输出。那么如何在程序中开启详细输出呢?

如果您只想 "detailed output" 为用户打印出来 运行 一个在 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 window 在 SQL 开发人员中),他们已经分配了足够的缓冲区等,调用者将看到“插入 1 行”(如果需要,可以添加更多代码以编程方式处理单数/复数的语法)。

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

There is no output about how many rows were inserted. How then, can we turn on detailed output in procedure?

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 投入生产。您可以将其用于记录目的。就像您想每天记录受程序影响的行数一样。

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

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;