ITPub博客

首页 > 数据库 > Oracle > [20250320]DBMS_OUTPUT.PUT_LINE输出限制.txt

[20250320]DBMS_OUTPUT.PUT_LINE输出限制.txt

原创 Oracle 作者:lfree 时间:2025-03-21 08:55:08 0 删除 编辑

[20250320]DBMS_OUTPUT.PUT_LINE输出限制.txt

--//去年遇到的问题,一直没时间看。生产系统遇到的问题。

1.环境:
SYS@127.0.0.1:9105/xtdb/xtdb1> @ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 19.0.0.0.0
BANNER                        : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
BANNER_LEGACY                 : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.问题提出:

SYS@127.0.0.1:9105/xtdb/xtdb1> @ ashtop sql_id 1=1  &day
    Total                                                                         Distinct Distinct    Distinct
  Seconds     AAS %This   SQL_ID        FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps Execs Seen1
--------- ------- ------- ------------- ------------------- ------------------- ---------- -------- -----------
    56967      .7   61% |               2024-12-25 08:45:13 2024-12-26 08:45:08          2    48165       48165
     2014      .0    2% | 6wcywxctbbvs8 2024-12-25 08:50:53 2024-12-26 08:41:17        283     2014         283
      697      .0    1% | 0za9fv0j1vgkk 2024-12-25 08:45:25 2024-12-26 08:43:02        682      696         684
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      613      .0    1% | 41a4d5z9cswza 2024-12-25 08:51:02 2024-12-26 08:41:19        280      603         280
      584      .0    1% | 0315jsvndf9s1 2024-12-25 08:45:47 2024-12-26 03:06:18        582      584         584
      526      .0    1% | d7sa2ga44303r 2024-12-25 08:51:13 2024-12-26 08:41:24        278      526         278
      521      .0    1% | fnxvn2huxfy5y 2024-12-25 08:51:11 2024-12-26 08:41:23        276      521         276
...

SYS@127.0.0.1:9105/xtdb/xtdb1> @ sql_id 0za9fv0j1vgkk
-- SQL_ID = 0za9fv0j1vgkk come from shared pool
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 11
--//直接使用我写的sql_id获取sql语句报错.执行查看这条语句来自MMON_SLAVE模块,超级长,而且似乎没有换行.
--//仔细检查才发现是DBMS_OUTPUT.PUT_LINE输出限制导致的问题。

3.简单验证:
$ uniq -c a.txt
      1 select /*+
    327 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
      1 00000000000000000000000000000000000
      1 */ sysdate from dual;

$ ls -l a.txt
-rw-r--r--. 1 oracle oinstall 32769 2025-03-20 16:44:31 a.txt
--//如果不包括最后分号以及回车,大小32767.

SCOTT@book01p> @ a.txt
SYSDATE
-------------------
2025-03-20 16:45:54

SCOTT@book01p> @ hashz

HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- ---------- ------------------- -----------
 456068362 buzxt98dky38a            0      68874  1b2f0d0a  2025-03-20 16:45:53    16777216

SCOTT@book01p> @ sql_id buzxt98dky38a
-- SQL_ID = buzxt98dky38a come from shared pool

DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 11
--//报错。如果删除a.txt 1个字符,执行后使用写的sql_id.sql脚本查询就不会报错。
$ wc  a.txt
  330   334 32768 a.txt

--//执行就不会报错,测试略。
--//另外一个简单验证。

SCOTT@book01p> variable v clob;
SCOTT@book01p> exec :v := lpad('x',32767,'x')||'y';

PL/SQL procedure successfully completed.

SCOTT@book01p> exec DBMS_OUTPUT.PUT_LINE(:v);
BEGIN DBMS_OUTPUT.PUT_LINE(:v); END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1

--//实际上DBMS_OUTPUT.PUT_LINE的参数是VARCHAR2,不是clob类型。
SCOTT@book01p> @ desc_proc sys DBMS_OUTPUT PUT_LINE
SCOTT@book01p>  @pr
==============================
OWNER                         : SYS
PACKAGE_NAME                  : DBMS_OUTPUT
OBJECT_NAME                   : PUT_LINE
SEQUENCE                      : 1
ARGUMENT_NAME                 : A
DATA_TYPE                     : VARCHAR2
IN_OUT                        : IN
DEFAULTED                     : N
PL/SQL procedure successfully completed.

--//一般sql语句很少超过32K,放弃修改。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3078276/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969776