我经常收到这个错误(太烦人了!):
错误报告:ORA-06502:PL / SQL:数字或值错误:字符 字符串缓冲区太小ORA-06512:在第305行 06502. 00000 - “PL / SQL:数字或值错误%s”
示例存储过程循环遍历游标(大约有10k行),执行某些逻辑,然后使用dbms_output.put_line
将每条记录打印到Oracle SQL Developer中的'Script Output'
选项卡。
有没有办法清除缓冲区或防止出现此错误(并中止其余的proc)?
如果可以的话,我可以使用Mod function
每10行处理一次清除缓冲区。
答案 0 :(得分:7)
我不相信这个错误与DBMS_OUTPUT缓冲区大小有任何关系,正如其他答案所暗示的那样。如果溢出该缓冲区,则得到的错误应为“ORA-20000:ORU-10027:缓冲区溢出,#####字节限制”。
此错误通常意味着PL / SQL字符串变量太小而无法保存分配给它的某个值。如果您传递的值大于它可以处理的值,则这可能是DBMS_OUTPUT的内部。但是你的堆栈跟踪现在会在堆栈中显示DBMS_OUTPUT,所以我认为情况并非如此。错误似乎发生在您的过程的第305行。它有什么作用?如果它是一个赋值,则可能需要以更大的大小声明变量begin assigned。
答案 1 :(得分:3)
DBMS_OUTPUT
的默认缓冲区大小为20000个字符。你可以用:
DBMS_OUTPUT.ENABLE(1000000);
没有“flush”的概念,因为在存储过程返回之前没有任何东西可以刷新。它实际工作的方式是行进入DB中的缓冲区,然后当SP完成时,客户端(例如SQL * Plus)显式提取该缓冲区(使用DBMS_OUTPUT.GET_LINES
)。它与您在C中习惯的printf()
完全不同。
答案 2 :(得分:1)
要输出大量内容,最好使用UTL_FILE而不是DBMS_OUTPUT并检查文件。或者使用临时表并在自治过程中执行插入操作,这样即使主过程因任何原因必须进行回滚,您也可以看到结果。 在这两种情况下,您还可以在程序仍在运行时查看部分结果;这是DBMS_OUTPUT无法提供的东西。
答案 3 :(得分:0)
接收CLOB而非varchar
的值