Oracle PL / SQL的dbms_output.put_line()vs dbms_output.put()

时间:2014-09-08 10:22:14

标签: oracle plsql sqlplus

我有一个小问题,我还没理解dbms_output.put_line()和dbms_output.put()之间的区别

set serveroutput on size 200000
Begin
dbms_output.put_line('A' || CHR(10) || 'B');
End;
/

exec dbms_output.put_line('A' || CHR(10) || 'B');

上面给出了两个不同行中的输出 A B 。但是

exec dbms_output.put('A')
exec dbms_output.put('B')
exec dbms_output.new_line

什么都不打印。我正在使用 SQL * Plus:版本11.2.0.1.0生产

2 个答案:

答案 0 :(得分:4)

您必须在每个PL / SQL块中写入完整的行。你写的是

Begin
  dbms_output.put_line('A' || CHR(10) || 'B');
End;
/

在一个PL / SQL块中写入两行“A”和“B”。当你写

exec dbms_output.put_line('A' || CHR(10) || 'B');

同样如此。

但是当你写作

exec dbms_output.put('A')
exec dbms_output.put('B')
exec dbms_output.new_line

你有三个独立的PL / SQL块。前两个写部分行,将被SqlPlus跳过。第三个块写一个完整但空行。

如果你写

begin
  dbms_output.put('A');
 dbms_output.put('B');
 dbms_output.new_line;
end;
/

一切都按预期工作。

原因是SqlPlus中的控制台输出如何工作:PL / SQL将输出写入中间缓冲区。 SqlPlus在每个执行的PL / SQL块的末尾获取此缓冲区的内容。然后它将该内容打印到控制台,同时只打印整行。因此,当它没有被新行字符终止时,它会跳过缓冲区中的最后一行。

从技术上讲,我怀疑SqlPlus还会在没有新行字符的情况下打印行,但是starightaway会在下一步中覆盖它们。从技术上讲,SqlPlus确实只从内部缓冲区中获取完整行,使用{{3 PL / SQL函数。

答案 1 :(得分:0)

假设您使用11g,您应该考虑PUT程序,因为它已过时且不再受Oracle支持。在以前的版本中,使用PUT,该行尚未完成。因为它不像PUT_LINE那样具有行尾标记,后者自动跟随行尾标记。

所以,如果您添加行尾标记,您将获得输出。

您可以查看这个旧问题Is dbms_output.put() being buffered differently from dbms_output.put_line()?