【发布时间】:2019-01-16 16:07:11
【问题描述】:
目前我使用 CLOB 来存储 all_objects 的存储过程的定义,但是一些过程长度很长,因此使用 Excute Immediate 执行非常困难,因为它在使用 CLOB 时跨越了长度
ORA-06502:PL/SQL:数字或值错误 06502. 00000 - “PL/SQL:数字或数值错误%s” *原因:算术、数字、字符串、转换或约束错误 发生了。例如,如果尝试 将值 NULL 分配给声明为 NOT NULL 的变量,或者如果 尝试将大于 99 的整数分配给变量 宣布 NUMBER(2)。 *行动:改变数据,它是如何被操纵的,或者它是如何声明的 值不违反约束。
DECLARE
v_output CLOB := NULL;
a CLOB := NULL;
srce VARCHAR2(1000) := NULL;
BEGIN
-- Note,we don't search for package bodies. We will extract the body
-- along with the package spec.
dbms_output.put_line('Database DDL For Selected Objects Report');
FOR dd IN (
SELECT
object_name,
status
FROM
all_objects
WHERE
status != 'VALID'
AND
object_name LIKE '%SP_RPT%'
) LOOP
a := '';
srce := dd.object_name;
dbms_output.put_line(srce || ' proceudure creation start');
FOR dd1 IN (
SELECT
text
FROM
dba_source
WHERE
type = 'PROCEDURE'
AND
name LIKE dd.object_name
) LOOP
-- DBMS_OUTPUT.put_line (dd1.text);
a := a || dd1.text;
-- DBMS_OUTPUT.put_line (a);
END LOOP;
dbms_output.put_line(a);
-- EXECUTE IMMEDIATE a ;
dbms_output.put_line(srce || ' proceudure Updated successfully');
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('ERROR occured while creating Procedure ' || srce);
dbms_output.put_line(a);
dbms_output.put_line(substr(
dbms_utility.format_error_stack
|| ' ,'
|| dbms_utility.format_error_backtrace,
1,
500
) );
RAISE;
END;
【问题讨论】:
-
EXECUTE IMMEDIATE 接受
CLOB语句,所以应该没有问题。 CLOB 的限制取决于您的数据库块大小,从 8 TB 到 128 TB 不等 - 我怀疑永远不会超过这个限制。 -
谢谢@WernfriedDomscheit 我太惊讶让我分享代码和错误
-
@WernfriedDomscheit 您能否检查答案 1 中的 cmets 并让我知道您的提要
-
只有一条错误消息是没有帮助的。你的代码是什么?在 CLOB 的情况下,肯定不是因为长度问题。
-
@SiddharthJain 你能评论你的代码的异常部分并运行它,看看你在哪一行得到错误。