Oracle,Sql*plus执行语句;DBMS_OUTPUT输出

有以下脚本,利用游标去更新表:

需更新的记录约7万条,在PL/SQL Developer中执行该脚本,卡死。

考虑将更新语句输出,再在PL/SQL Developer直接执行更新语句。于是将脚本稍加改动:

在PL/SQL Developer中执行遇到错误overflow。

overflow原因:在Oracle10gr2版本以前中,利用DBMS_output.putline()来输出是有限制的,包括每行的字符个数(255)及缓存文件的大小(最大可以通过set serveroutput on size 1000000设置到1M),输出缓存超出这个大小会报overflow的Oracle异常。

从10gr2版本开始,使用DBMS_output输出的每行的字符个数可以有32767个,默认缓存大小是无限制的(unlimited)。

服务器上的oracle即是10gr2版本,将输出脚本在10gr2版本的oracle客户端sql*plus中测试,可以正常输出。但在PL/SQL Developer 7.1.5里面的sql window中执行,一直会报overflow的异常。

为了完整的看到这近7万条dbms_outpout.putline()的输出,考虑将内容输出到文件中。将脚本保存为文件a.sql,在Oracle自带的sql*plus中,逐条执行命令

SET SERVEROUTPUT ON;--开启dbms_output控制台输出
SET SQLBLANKLINES ON;--运行sql语句换行
SPOOL c:\a.log;--将控制台输出保存到文件a.log
@ c:\a.sql;--执行a.sql
spool off;


 

即将近7万条sql语句保存到文件中。

(不要在sql developer的command window中执行上述命令,仍会报overflow的错误。)

对文件在ultraeditor中用正则表达式查找\替换,使其每行都以一个完整的update语句(便于直观观察),另存为。

在sql*plus中执行处理后另存的文件。


PS:在sql*plus中,默认以换行符作为sql语句结束的标识, 这在从其它地方拷贝脚本到sql*plus中执行时很麻烦,原因是sqlplus遇到空行就认为是语句结束了。通过SET SQLBLANKLINES ON可避免此问题。另外,对于可单行执行的sql脚本,在末尾分号处换行即可执行该脚本。对于多行复杂的sql语句,在语句最后的分号后换行输入/,即可执行语句。


你可能感兴趣的:(oracle,sql,oracle,output,脚本,正则表达式,服务器)