oracle dbms-爱代码爱编程
Oracle dbms_output vs utl_file 使用(一)
背景
最近在写一段shell call 存储过程的代码,基本有代码就需要写log。我目前使用dbms_output写log但是领导提示dbms_output有缺陷希望改成utl_file,那就调查一下吧。
我的shell代码很简单 :
#前面的忽略......
echo myProcedure.sql | splplus ${connectStr} >> $logFile
#上面代码的意思是执行myProcedure.sql文件,然后日志(dbms_output的内容)输出到$logFile
#下面的忽略......
dbms_output
dbms_output最常用的方法**dbms_output.put_line(varchar2)**输出一行字符串(其它方法暂不讨论),官网文档介绍PUT_LINE会产生两种 Exceptions:
Error | Descriptions |
ORA-20000, ORU-10027: | Buffer overflow, limit of <buf_limit> bytes. 超出缓冲区限制,默认的限制长度是20000 bytes(20000字符)。 |
ORA-20000, ORU-10028: | Line length overflow, limit of 32767 bytes for each line. 单行字符串长度不能超出32767个字符。 |
dbms_output buffer的默认长度是20000字符,可以使用dbms_output.enable(buffer size)来调整缓冲区的大小。最小2000,最大1,000,000,null表示不限制缓存区大小(旧版的Oracle可能不支持)。
来看看例子:
set SERVEROUTPUT ON;
DECLARE
str VARCHAR2(4000);
str767 VARCHAR2(767);
BEGIN
--DBMS_OUTPUT.ENABLE(20000); defalut buffer is 20000
str := '123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-';
str767 := '123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-1234567';
DBMS_OUTPUT.PUT_LINE('str length is:'||length(
str || str || str || str || str || str || str || str
|| str || str || str || str || str || str || str || str || str767));
--这里调整buffer长度
DBMS_OUTPUT.ENABLE(NULL); --update buffer size to nulimit
DBMS_OUTPUT.PUT_LINE('line 1:');
DBMS_OUTPUT.PUT_LINE(str || str || str || str || str || str || str || str
|| str || str || str || str || str || str || str || str || str767);
DBMS_OUTPUT.PUT_LINE('line 2:');
DBMS_OUTPUT.PUT_LINE(str || str || str || str || str || str || str || str
|| str || str || str || str || str || str || str || str || str767);
END;
设置dbms_output.enable(2000)后输出长度2000的字符串成功,输出长度2001的字符串失败。
设置dbms_output.enable(NULL)后输出长度10000和32767的字符串成功,输出32768的字符串失败。
输出两行32767的字符串成功,说明32767的限制是输出一行的限制。
注意:dbms_output 使用前要先设置set SERVEROUTPUT ON;
dbms_output的官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/21/arpls/DBMS_OUTPUT.html
本文只是个人(EnergyNo8)学习笔记如有错误请网友指出。
如有引用或转载请标明出处!
努力、坚持,总会有收获!
______ EnergyNo8