[20211231]set linesize and dbms_output.line输出问题.txt --//昨天改写sql_id.sql脚本,主要原因有几个. 1.开发写代码不规范,里面拚接的字符使用\r,没有\n,导致sqlplus的输出乱码,多次建议开发替换纠正这个错误,没用. 2.剩下的两个问题是我最近遇到的,不知道那个开发写sql代码都是一行,而且字段与字段之间还有很多空格,导致语句很长. 导致我抽取后给格式化,然后在考虑优化问题.我甚至要设置set linesize 10000,不然会出现换行问题.导致抽取的语句 无法执行. --//补充一点:我个人认为不是懒,而是职业素养不够,真不知道这位开发那个学校毕业的. 3.另外一个问题,也是不知道那位开发写sql代码在每个字段输出的后面,写入大量注解说明.这样即使一条很短的sql语句也被他写的很长, 总之我最近遇到的问题主要都是超长sql语句的问题. --//而我在使用sql_id抽取时,遇到奇怪问题,我自己也没有想到与set linesize设置以及dbms_output.line输出有关,通过例子说明问题. 1.环境: SCOTT@book> @ver1 PORT_STRING VERSION BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 2.写一个长超的sql语句: --//注意sqlplus每行有2499 characters限制. SCOTT@book> @ b1.txt Input truncated to 7499 characters SP2-0027: Input is too long (> 2499 characters) - line ignored SP2-0734: unknown command beginning "sdasd asda..." - rest of line ignored. $ cat bb1.txt select sysdate --0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 --//38 line snip --012345678901234567890123456789012345678901234567890123456789012345678901234567890ZY34567890123456 --//9 line snip --0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 from dual ; --//注1行99个字符,加上结尾的\n,unix文件格式,正好每行100个字符. --//注意一串数字里面有两个字符ZY,正好在4000,4001的位置。 --//定位4000位置在vim下使用:goto 4000,使用g ctrl+g 显示位置。 3.测试: $ cat sql_id.sql SET LINESIZE 4000 VAR V_SQL_FULLTEXT CLOB COL SQL_FULLTEXT FOR A4000 WORD_WRAP SET FEEDBACK OFF SET SERVEROUTPUT ON SET SERVEROUTPUT ON FORMAT TRUNCATED PROMPT PROMPT --SQL_ID = &&1 DECLARE V_SQL_FULLTEXT CLOB; V_COUNT NUMBER; BEGIN DBMS_OUTPUT.PUT_LINE (' '); SELECT COUNT(*) INTO V_COUNT FROM GV$SQLAREA WHERE SQL_ID = '&&1' AND ROWNUM=1; IF V_COUNT=1 THEN SELECT REPLACE (SQL_FULLTEXT||';', CHR(13), '') SQL_FULLTEXT INTO V_SQL_FULLTEXT FROM GV$SQLAREA WHERE SQL_ID = '&&1' AND ROWNUM = 1; DBMS_OUTPUT.PUT_LINE (V_SQL_FULLTEXT); ELSE SELECT COUNT(*) INTO V_COUNT FROM DBA_HIST_SQLTEXT WHERE SQL_ID='&&1' AND ROWNUM=1; IF V_COUNT=1 THEN SELECT REPLACE (SQL_TEXT||';',CHR(13),'') INTO V_SQL_FULLTEXT FROM DBA_HIST_SQLTEXT WHERE SQL_ID='&&1' AND ROWNUM=1; DBMS_OUTPUT.PUT_LINE (V_SQL_FULLTEXT); END IF; END IF; DBMS_OUTPUT.PUT_LINE (' '); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; / SET SERVEROUTPUT OFF SET FEEDBACK 6 SET LINESIZE 277 4.测试: SCOTT@book> @ bb1.txt SYSDATE--0123456789 ------------------- 2021-12-31 09:34:09 SCOTT@book> @hash HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE SQL_EXEC_START SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ------------------- ----------- 879656348 aahvby0u6wzcw 0 32156 1388734953 2021-12-31 09:34:08 16777216 SCOTT@book> @sql_id aahvby0u6wzcw --SQL_ID = aahvby0u6wzcw select sysdate --0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 --// 38 line snip --012345678901234567890123456789012345678901234567890123456789012345678901234567890ZY --//你可以发现显示仅仅在4001位置。 --//我必须设置SET LINESIZE 32767,才能完全输出。编写时在这里浪费一点点时间,有点奇怪的是我以前写的 --//http://blog.itpub.net/267265/viewspace-1700792/ -> [20150616]Creating Test Script With Bind Variable.txt --//已经更新多次,好像没有遇到这类问题,我还给仔细探究。 --//我仔细看了脚本,里面的设置是set linesize 4000,理论讲也应该遇到我测试发现的问题,奇怪我应该已经遇到超过4000字符的sql --//语句,为什么以前没有出现呢?继续测试: SCOTT@book> @ b8 aahvby0u6wzcw 0 1 ... --//我看到抽取的执行语句如下: select sysdate --0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 --// 38 line snip --012345678901234567890123456789012345678901234567890123456789012345678901234567890ZY 34567890123456 --0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 --// 9 line snip --0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 from dual; --//是有输出,不过换了行罢了。 --//最终我发现问题在 SET SERVEROUTPUT ON FORMAT TRUNCATED --//修改为 SET SERVEROUTPUT ON FORMAT WRAP --//问题解决。哎,学艺不精啊。 --//因为要使用dbms_output.put_line输出行,参考连接 --//http://blog.itpub.net/267265/viewspace-2743228/ => [20201218]dbms_output.put_line无法输出前面的空格.txt --//最终我修改了sql_id,b8脚本,选择set linesize 32767,使用prompt输出一空行。 $ cat sql_id.sql SET LINESIZE 32767 --SET LINESIZE 4000 VAR V_SQL_FULLTEXT CLOB COL SQL_FULLTEXT FOR A4000 WORD_WRAP SET FEEDBACK OFF SET SERVEROUTPUT ON PROMPT PROMPT --SQL_ID = &&1 PROMPT DECLARE V_SQL_FULLTEXT CLOB; V_COUNT NUMBER; BEGIN SELECT COUNT(*) INTO V_COUNT FROM GV$SQLAREA WHERE SQL_ID = '&&1' AND ROWNUM=1; IF V_COUNT=1 THEN SELECT REPLACE (SQL_FULLTEXT||';', CHR(13), '') SQL_FULLTEXT INTO V_SQL_FULLTEXT FROM GV$SQLAREA WHERE SQL_ID = '&&1' AND ROWNUM = 1; DBMS_OUTPUT.PUT_LINE (V_SQL_FULLTEXT); ELSE SELECT COUNT(*) INTO V_COUNT FROM DBA_HIST_SQLTEXT WHERE SQL_ID='&&1' AND ROWNUM=1; IF V_COUNT=1 THEN SELECT REPLACE (SQL_TEXT||';',CHR(13),'') INTO V_SQL_FULLTEXT FROM DBA_HIST_SQLTEXT WHERE SQL_ID='&&1' AND ROWNUM=1; DBMS_OUTPUT.PUT_LINE (V_SQL_FULLTEXT); END IF; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; / PROMPT SET SERVEROUTPUT OFF SET FEEDBACK 6 SET LINESIZE 277 --//没有想到问题出在我设置SET SERVEROUTPUT ON FORMAT TRUNCATED。
[20211231]set linesize and dbms_output.line输出问题.txt
来源:这里教程网
时间:2026-03-03 17:22:10
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 【Oralce漏洞与安全】AHF的Log4j漏洞修复
【Oralce漏洞与安全】AHF的Log4j漏洞修复
26-03-03 - Oracle 21C区块链表
Oracle 21C区块链表
26-03-03 - 聊聊虚拟化和容器对数据库的影响
聊聊虚拟化和容器对数据库的影响
26-03-03 - AS、SAN、NAS三种存储
AS、SAN、NAS三种存储
26-03-03 - 十个关于互联网圈的冷知识
十个关于互联网圈的冷知识
26-03-03 - Oracle:SCN
Oracle:SCN
26-03-03 - 内存卡视频删除后怎么恢复?三个步骤一看就会
内存卡视频删除后怎么恢复?三个步骤一看就会
26-03-03 - 批量锁(适用各种关系型数据库)
批量锁(适用各种关系型数据库)
26-03-03 - DATAGUARD配置参数详细解释
DATAGUARD配置参数详细解释
26-03-03 - 数据迁移
数据迁移
26-03-03
