代码编织梦想

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的字符串失败。

ab539c4c0ee2452ea39914758324ba2f.png
f4149bdf10d8470eb212ba78594c711c.png

设置dbms_output.enable(NULL)后输出长度10000和32767的字符串成功,输出32768的字符串失败。

4cd93ce59fae4b5e99395d738fa5a4c0.png
8e2be27ad1ae4577aee42194d6ecb084.png
2aed58116f5449ffa57ef366b24162b0.png

输出两行32767的字符串成功,说明32767的限制是输出一行的限制。

f8809ea5e5b54fc98722f295516dd678.png

注意:dbms_output 使用前要先设置set SERVEROUTPUT ON;

dbms_output的官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/21/arpls/DBMS_OUTPUT.html


本文只是个人(EnergyNo8)学习笔记如有错误请网友指出。
如有引用或转载请标明出处!
努力、坚持,总会有收获!
______ EnergyNo8
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41408714/article/details/128859028

qt-无标题窗口_j4cks0n的博客-爱代码爱编程_qt 窗口无标题栏

        今天学习了下无标题窗口,于是来记录下我的学习过程 首先建立一个Qt Widgets Application继承QWidget类创建完后直接运行就得到了如下效果 那么,既然是无标题窗口就要去掉窗口栏啊,于是加上 setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButton