Oracle 中的dbms_output.put_line

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 中的dbms_output.put_line相关的知识,希望对你有一定的参考价值。

declare
m number(6);
begin
dbms_output.put_line('请输入一个数字');
m:=&x;
dbms_output.put_line(m);
end;
中的dbms_output.put_line('请输入一个数字');
怎么才能让他在m:=&x;执行输出

参考技术A 最后要加上‘/’.

declare
2 c_tax_rate number(3,2):=0.03;
3 v_tax_sal number(7,2);
4 v_name varchar2(5);
v_sal number(7,2);
6 begin
7 select ename,sal into v_name,v_sal from emp where empno=&no;
8 v_tax_sal := v_sal*c_tax_rate;
9 dbms_output.put_line('姓名:'||v_name ||'工资:' ||v_sal ||'纳税:' ||v_tax_sal);
10 end;
11 /

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

【中文标题】Oracle PL/SQL 的 dbms_output.put_line() 与 dbms_output.put()【英文标题】:Oracle PL/SQL's dbms_output.put_line() vs dbms_output.put() 【发布时间】:2014-09-08 10:22:14 【问题描述】:

我有一个小问题,我还没有理解 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');

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

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

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

【问题讨论】:

【参考方案1】:

您总是必须在每个 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 也会打印没有换行符的行,但会在下一步中直接覆盖它们。 从技术上讲,SqlPlus 确实使用 DBMS_OUTPUT.GET_LINES 从内部缓冲区中获取完整行PL/SQL 函数。

【讨论】:

事实上,所有能够显示 dbms_output 的工具都使用 DBMS_OUTPUT.GET_LINES :-)【参考方案2】:

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

所以,如果你添加一个行尾标记,你会得到输出。

你可以看看这个老问题Is dbms_output.put() being buffered differently from dbms_output.put_line()?

【讨论】:

是的,当然可以。这就是我的意思,PUT 需要一个行尾标记。然后 NEW_LINE 让缓冲的输出打印出来。 来自文档:“采用 NUMBERPUT 过程已过时”,而不是 OP 使用的版本。 PUT_LINE 也是如此。 好的,我在文档中看到了。 Dan Morgan 在他的网站上发表声明psoug.org/reference/dbms_output.html

以上是关于Oracle 中的dbms_output.put_line的主要内容,如果未能解决你的问题,请参考以下文章

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

在 oracle 中打印进度

数据库_存储过程简介(oracle版)

oracle 10.2.0 如何在plsql 里设置 dbms_output.put_line 打印长度

oracle游标使用遍历3种方法

dbms_output.put_line 在存储过程的 Cursor For 循环内不起作用