该包通常用于调试,或用于向 SQL*DBA 或 SQL*Plus 显示消息和报告 此包中的PUT 过程和PUT_LINE 过程能够将信息放置在可由另一个触发器、过程或包读取的缓冲区中。 在单独的 PL/SQL 过程或匿名块中, 您可以通过调用GET_LINE 过程和GET_LINES 过程来显示缓冲的信息。 如果包被禁用,所有对子程序的调用都将被忽略。通过这种方式,您可以设计您的应用程序, 以便仅当客户端能够处理信息时子程序才可用。 DBMS_OUTPUT 规则和限制
最大行大小为 32767 字节。
默认缓冲区大小为 20000 字节。最小大小为 2000 字节,最大为无限制。
DBMS_OUTPUT 子程序介绍
| 描述 | 描述 |
|---|---|
| DISABLE Procedure | 禁用消息输出 |
|
ENABLE Procedure |
启用消息输出 |
|
GET_LINE Procedure |
从缓冲区中检索一行 |
|
GET_LINES Procedure |
从缓冲区检索行数组 |
|
NEW_LINE Procedure |
终端使用创建的行,一行的结束 |
|
PUT Procedure |
在缓冲区中放置部分行 |
|
PUT_LINE Procedure |
将行放入缓冲区 |
下面主要介绍 三个过程。PUT PUT_LINE NEW_LINE 示例:
--put和new_line
SQL> set serveroutput on; --显示结果
begin
dbms_output.put('a'); --写入buffer但不输出
dbms_output.put('b'); --写入buffer但不输出
dbms_output.new_line; --回车(换行),输出
dbms_output.put_line('hello world!'); --输出并换行
dbms_output.put('d'); --写入buffer但不输出
end;
/ SQL> 2 3 4 5 6 7 8
ab
hello world!
PL/SQL procedure successfully completed.
SQL>
注:使用get_line时不能用put_line输出,因为put_line之后会将buffer清空。(当然在serveroutput off的情况下put_line是不影响buffer的)。 示例:
--get_line
declare
msg varchar2(120);
cursor t_cur is select * from t order by a;
v_line varchar2(100);
v_status integer := 0;
begin
dbms_output.enable;
for i in t_cur loop
msg := i.a || ',' || i.b || ',' || i.c;
dbms_output.put_line(msg); --put
end loop;
dbms_output.get_line(v_line, v_status); --get
while v_status = 0 loop
insert into tt values(v_status, v_line);
dbms_output.get_line(v_line, v_status);
end loop;
end;
/
--get_lines
set serveroutput on;
declare
v_data dbms_output.chararr;
v_numlines number;
begin
--enable the buffer first.
dbms_output.enable(1000000);
dbms_output.put_line('line one');
dbms_output.put_line('line two');
dbms_output.put_line('line three');
v_numlines := 3;
dbms_output.get_lines(v_data, v_numlines); --array, index
for v_counter in 1..v_numlines loop
dbms_output.put_line(v_data(v_counter));
end loop;
end;
/
参考:
https://www.cnblogs.com/forestwolf/p/4885160.html
官方文档
