PL / SQL - 防止ORA-06502

时间:2011-11-04 14:00:24

标签: sql database oracle plsql

我经常收到这个错误(太烦人了!):

  

错误报告: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行处理一次清除缓冲区。

4 个答案:

答案 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

的值