【问题标题】:Getting output in PLSQL procedure在 PLSQL 过程中获取输出
【发布时间】:2016-02-03 16:04:49
【问题描述】:

通常,在 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

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

【问题讨论】:

    标签: sql oracle plsql oracle-sqldeveloper


    【解决方案1】:

    如果您只想为在启用了适当设置的 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(使用 SQL Developer 中的 dbms_output 窗口),那么他们已经分配了足够的缓冲区等,调用者将看到“插入了 1 行”(如果您想以编程方式处理单数/复数的语法,您可以添加更多代码)。

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

    【讨论】:

    • +1 关于实现 REAL 日志记录。将 dbms_outputs 粘贴在代码中以用于调试目的,这将面临生产风险,一旦会话在现实世界中超出 dbms_output 缓冲区就会爆炸。
    • 所以 prod 环境中真正的 dbms_output 会造成一团糟。
    • 同意的 dbms_output 用于开发/测试环境中的基本调试,默认情况下,它的输出在大多数应用程序中不显示,因为它需要额外的代码来检索它。但是我已经看到它在生产批次中使用得很好。从作业调度程序调用的 Perl 代码自动调用 dbms_output.get_lines 并打印输出,以便将其包含在日志文件中。可能不如日志表好(并且仍然存在因缓冲区大小过大而导致 PGA 问题的风险),但它完成了工作。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-06
        • 2013-10-16
        • 1970-01-01
        • 2019-05-24
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多