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

Ibr*_*ish 1 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');
Run Code Online (Sandbox Code Playgroud)

上面给出了两行不同的输出AB。

exec dbms_output.put('A')
exec dbms_output.put('B')
exec dbms_output.new_line
Run Code Online (Sandbox Code Playgroud)

不打印任何内容。我正在使用SQL*Plus:版本 11.2.0.1.0 生产

ste*_*hke 5

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

Begin
  dbms_output.put_line('A' || CHR(10) || 'B');
End;
/
Run Code Online (Sandbox Code Playgroud)

您将两整行“A”和“B”写入一个 PL/SQL 块中。当你写的时候

exec dbms_output.put_line('A' || CHR(10) || 'B');
Run Code Online (Sandbox Code Playgroud)

这也是同样的道理。

但是当你写的时候

exec dbms_output.put('A')
exec dbms_output.put('B')
exec dbms_output.new_line
Run Code Online (Sandbox Code Playgroud)

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

如果你写

begin
  dbms_output.put('A');
 dbms_output.put('B');
 dbms_output.new_line;
end;
/
Run Code Online (Sandbox Code Playgroud)

一切都按预期进行。

其原因在于 SqlPlus 中控制台输出的工作方式:PL/SQL 将输出写入中间缓冲区。SqlPlus 在每个执行的 PL/SQL 块末尾获取此缓冲区的内容。然后,它将该内容打印到控制台,同时仅打印整行。因此,当缓冲区中的最后一行不是由换行符终止时,它会跳过缓冲区中的最后一行。

从技术上讲,我怀疑 SqlPlus 也会打印没有换行符的行,但在下一步中立即覆盖它们。从技术上讲,SqlPlus 确实使用 PL/SQL 函数从内部缓冲区中仅获取整行DBMS_OUTPUT.GET_LINES