sqlplus执行外部.sql文件时,DBMS_OUTPUT内容无法写入日志文件的问题求助
sqlplus执行外部.sql文件时,DBMS_OUTPUT内容无法写入日志文件的问题求助
嗨,我来帮你分析下这个问题,大概率是SERVEROUTPUT的设置时机或者作用域导致的,给你几个可行的解决方案:
方案一:在SQL*Plus会话初始化时就开启SERVEROUTPUT
把SET SERVEROUTPUT ON SIZE UNLIMITED移到shell脚本的EOF块里,放在调用外部sql文件之前,这样整个会话都会生效:
LOG=output.log sqlplus -s user/pwd@db << EOF > ${LOG} WHENEVER OSERROR EXIT 9; WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK; # 先开启服务器输出,设置无限缓冲大小 SET SERVEROUTPUT ON SIZE UNLIMITED; @testsqlfile EOF
然后可以把testsqlfile.sql里的SET SERVEROUTPUT ON删掉(留着也不冲突,不过统一设置更清晰)。
方案二:确保外部sql文件的输出设置完全生效
如果一定要在外部sql文件里设置SERVEROUTPUT,可以尝试加上SET TERMOUT ON(虽然默认是ON,但有时候会被环境变量或者之前的配置覆盖),同时明确指定缓冲大小:
SET TERMOUT ON; SET SERVEROUTPUT ON SIZE UNLIMITED; EXEC DBMS_OUTPUT.PUT_LINE('TEST');
为什么直接写在EOF块里能生效?
当你把SET SERVEROUTPUT和EXEC直接写在EOF里时,这些命令是在同一个SQLPlus会话流里连续执行的,设置立刻生效;而调用外部sql文件时,如果会话初始没有开启SERVEROUTPUT,可能外部文件的设置在执行EXEC前没有完全加载(或者某些版本的SQLPlus对外部脚本的设置有延迟),导致输出没有被捕获。
你可以先试试方案一,这个应该能解决大部分类似问题~
备注:内容来源于stack exchange,提问作者Alex Danilov
相关产品推荐
相关产品推荐

