4

我使用 Aqua Data Studio 通过分散输出语句来调试存储过程。

我在包中有一个违反完整性约束的删除语句:

DELETE FROM x WHERE x.ID = an_x_with_children;

正如预期的那样,我的 proc 在这一行出现 ORA-02292 失败。我想查看an_x_with_children变量的值。所以我用这样的输出换行:

dbms_output.put('Attempting to delete x: ' || an_x_with_children);
DELETE FROM x WHERE x.ID = an_x_with_children;
dbms_output.put(' Success');

并期望在违反完整性约束错误消息之前将消息视为消息控制台中的最后一件事。 但它不打印!

现在,如果我更改输出以使用如下put_line()过程:

dbms_output.put_line('Attempting to delete x: ' || an_x_with_children);
DELETE FROM x WHERE x.ID = an_x_with_children;
dbms_output.put_line(' Success');

我在 proc 出错之前立即看到消息“尝试删除 x:123”。

包的文档dbms_output没有提到putput_line过程在这方面的行为有任何不同。例如,它说

您使用 PUT 或 PUT_LINE 创建的输出被缓冲。

因此,我希望在 proc 错误时两者都显示输出,或者都不显示输出。

有人可以向我解释这种行为是怎么回事吗?

4

1 回答 1

6

这是一个显示您所看到的行为的示例:

SQL> exec dbms_output.put_line('hello')
hello

PL/SQL procedure successfully completed.

SQL> exec dbms_output.put('hello again')

PL/SQL procedure successfully completed.

SQL> exec dbms_output.put(' and again')

PL/SQL procedure successfully completed.

SQL> exec dbms_output.new_line
hello again and again

PL/SQL procedure successfully completed.

文档说“ SQL*Plus 在发出 SQL 语句或匿名 PL/SQL 调用后调用 GET_LINES”。

并且过程 GET_LINES 说“这个过程从缓冲区中检索一个行数组。”

使用 PUT,您还没有完成您的线路。所以它不打印。

NEW_LINE 过程也提到了这一点:“这个过程放置了一个行尾标记。GET_LINE 过程和 GET_LINES 过程返回由“换行符”分隔的“行”。每次调用 PUT_LINE 过程或 NEW_LINE 过程都会生成一行由 GET_LINE(S) 返回。”

问候,
罗布。

于 2012-09-21T14:39:06.450 回答