哪种数据类型支持更多的字符串/字符,然后是CLOB



目前我使用 CLOB 来存储存储all_objects存储过程的定义,但有些过程长度很长,因此使用 Excute Immediate 很难执行,因为它使用 CLOB 交叉长度 inw hile

ORA-06502:PL/SQL:数字或值错误 06502. 00000 - "PL/SQL: 数字或值错误%s" *原因:算术、数字、字符串、转换或约束错误 发生。例如,如果尝试 将值 NULL 分配给声明为 NOT NULL 的变量,或者如果 尝试将大于 99 的整数分配给变量 声明编号(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_statement

dynamic_sql_stmt

表示 SQL 语句的字符串文本、字符串变量或字符串表达式。其类型必须为 CHAR、VARCHAR2 或 CLOB。

参考 : https://docs.oracle.com/database/121/LNPLS/executeimmediate_statement.htm#LNPLS01317

有关数据类型大小和用法的更多信息,请参阅: https://sqljana.wordpress.com/2017/02/07/oracle-clob-vs-varchar2-when-when-not-to-use/

我建议CLOB是你更好的选择。

你可以这样尝试:

FOR dd1 IN (SELECT text FROM dba_source WHERE ... ORDER BY LINE) LOOP
a := a || dd1.text ||CHR(13);
END LOOP;

但是,这样做的目的是什么?很可能是一个简单的

FOR dd IN (
SELECT object_name, object_type, status
FROM all_objects
WHERE status != 'VALID'
AND object_name LIKE '%SP_RPT%') 
LOOP
EXECUTE IMMEDIATE 'ALTER '||dd.object_type||' '||dd.object_name||' COMPILE';
if dd.object_type = 'PACKAGE BODY' THEN
EXECUTE IMMEDIATE 'ALTER '||dd.object_type||' '||dd.object_name||' COMPILE BODY';
END IF;
END LOOP;

也会这样做。

相关内容

最新更新