我有一个过程,在这个过程中,我试图向dbms_output编写一个源代码(1290行),如下所示:
dbms_output.put_line(DBMS_METADATA.GET_DDL('FUNCTION', 'name', 'owner')); --MYPROC, line 6
我得到:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: in "MYPROC", line 6
。此错误发生在toad中。我可以在toad的编辑器选项卡中执行:
SELECT DBMS_METADATA.GET_DDL('FUNCTION', 'name', 'owner') FROM DUAL;
我的意思是我得到的源代码在'数据网格'。
当我尝试将代码存储在CLOB变量中时,也会发生同样的情况:
src CLOB;
...
src := DBMS_METADATA.GET_DDL('FUNCTION', 'name', 'owner') ; --MYPROC, line 6
有线索吗?
2条答案
按热度按时间b4qexyjb1#
来自
dbms_output
的文档:最大行大小为32767字节。
这意味着在一个
put_line
调用中不能传递超过这个值的代码。您当前传递的是整个CLOB,它有1290行代码,很可能超过这个限制。当您这样做时,您会得到错误“ORA-06502:PL/SQL:数字或值错误”,如您所见。您可以将CLOB拆分为更小的块,由于它已经是多行,因此将每个块作为DDL中的一行是有意义的。您可以通过查找换行符、提取下一个字符之前的所有文本并将其打印出来来实现这一点。您需要几个变量来跟踪您所处的位置。类似于下面这样的操作应该对您有用:
如果您有一行(末尾有没有换行符)超过32 k,那么它就不起作用了,希望这不会成为DDL的问题(您可以处理这个问题,但是这样做会注入额外的换行符,这也不好)。
mu0hgdu02#
你说的不可能是真的。
DBMS_OUTPUT.PUT_LINE
不能在SQL级别使用,它属于PL/SQL。MYPROC
?它在第6行包含什么?数值或值错误通常与您试图将“大”值存储到“小”变量中有关:
我猜你就是这么做的。
另一个原因是错误地声明了变量,例如
我来猜猜你可能在做什么:
正如你所看到的,它对我来说还可以。包不是那么小(看它的长度),所以-不能真正告诉你哪里做错了。我建议你做完全像我一样-复制/粘贴我上面发布的代码(这7行),修复信息(函数,它的名称,所有者),并通过编辑原始问题发布结果,而不是作为注解。