【问题标题】:SQL Developer DBMS_OUTPUT without 'PL/SQL procedure successfully completed.'SQL Developer DBMS_OUTPUT 没有“PL/SQL 过程已成功完成”。
【发布时间】:2018-09-08 08:07:00
【问题描述】:

在 SQL Developer 中,当运行一些 PL/SQL 时,当过程完成时,消息“PL/SQL 过程成功完成”。被退回。

如果由于任何原因无法通过 DBMS_OUTPUT.PUT_LINE 完成操作,正在运行的 PL/SQL 可能会向用户返回错误消息,但是,用户也会看到“PL/SQL 过程已成功完成。”,其中可能会产生误导(特别是如果脚本输出窗口足够小以至于 DBMS_OUTPUT 不可见)。

有什么方法可以让 DBMS_OUTPUT 返回它应该返回的内容,同时让脚本不返回“PL/SQL 过程已成功完成。”?

如果没有,SQL Developer 中是否有任何我可能不知道的替代方案可以向用户提供即时个性化反馈?

declare 

    testex exception;

begin

    if 1=1 then 
        raise testex;
    end if;

exception when testex then

    dbms_output.put_line('Error msg');

end;

【问题讨论】:

  • dbms_output 的输出不是错误,所以程序成功的反馈是正确的。如果你想发出错误信号,那么在你的 PL/SQL 代码中抛出一个异常
  • 因为我需要提供即时用户反馈,所以我将 DBMS_OUTPUT 放在异常中解释错误;但是,即使引发异常,消息“PL/SQL 过程已成功完成”。仍然显示
  • edit 你的问题并告诉我们代码
  • 已添加代码。运行代码显示“错误消息”以及“PL/SQL 过程已成功完成。”。为了实用和避免混淆,我只需要显示“错误消息”
  • 您的异常处理程序吞下了异常,因此就调用者而言,它从未发生过

标签: sql oracle plsql oracle-sqldeveloper dbms-output


【解决方案1】:

下面的代码对我有用。您是否尝试像下面那样运行您的代码?

从网站上复制文本以解释 SET FEEDBACK OFF 命令。

来源链接:https://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm

设置提要[返回] {6 | n |开 |离开} - 当脚本选择至少 n 条记录时,显示脚本返回的记录数。

ON 或OFF 会打开或关闭此显示。将反馈设为 ON 会将 n 设为 1。将反馈设为 0 相当于将其设为 OFF。

SET FEEDBACK OFF 还会关闭在 SQL 或 PL/SQL 语句成功后显示的语句确认消息,例如“表已创建”和“PL/SQL 过程成功完成”。

【讨论】:

  • 一个小小的解释说明它是“SET FEEDBACK OFF”阻止了“PL/SQL 过程成功完成”。显示的消息会将其从问题变成答案。
  • 查看我更新的答案。我相信这个问题与此链接 stackoverflow.com/questions/250509/… 重复
  • 它很可能是重复的,但它也是一个答案,是正确的答案。
【解决方案2】:

在错误处理程序中添加RAISE 语句以重新引发异常,以便任何外部处理程序都可以处理它:

declare 

    testex exception;

begin

    if 1=1 then 
        raise testex;
    end if;

exception when testex then

    dbms_output.put_line('Error msg');

    RAISE;  -- re-raise the exception to an outer handler

end;

祝你好运。

【讨论】:

  • 感谢您的回复,但是如果我的代码被隔离而没有外部异常处理程序,这将如何工作? IE。我提供的代码将如何生成没有“PL/SQL 过程成功完成”的 DBMS_OUTPUT。
【解决方案3】:

您已对其进行显式编码,以便在出现testex 异常时成功完成。代码说:如果发生这种情况,则打印一条消息并结束。如果您希望它实际失败,则需要引发异常。

我会使用这样的东西:

begin
    if 1=1 then 
        raise_application_error(-20000, 'Bananas are not available on a Tuesday');
    end if;
end;
/

begin
*
ERROR at line 1:
ORA-20000: Bananas are not available on a Tuesday
ORA-06512: at line 3

这将导致一个实际的错误,而不是仅仅打印出一条碰巧谈论错误的消息,允许您控制部署和构建脚本等。

它还会回滚块内所有未提交的事务,而您当前的方法不会,它会显示实际的行号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    相关资源
    最近更新 更多