首页 > 解决方案 > 哪种数据类型支持更多的字符串/字符然后 CLOB

问题描述

目前我使用 CLOB 来存储 all_objects 的存储过程的定义,但是一些过程长度很长,因此使用 Excute Immediate 执行非常困难,因为它使用 CLOB 跨越长度

ORA-06502: PL/SQL: numeric or value error 06502. 00000 - "PL/SQL: numeric or value error%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;

标签: oracleplsqloracle11g

解决方案


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 在你的情况下是一个更好的选择。


推荐阅读