通常情况下,在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
没有关于插入了多少行的输出。那么,我们可以在程序中打开详细输出吗?
答案 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;