【问题标题】:which data type is support more string/characters then CLOB哪种数据类型支持更多的字符串/字符然后 CLOB
【发布时间】: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 你能评论你的代码的异常部分并运行它,看看你在哪一行得到错误。

标签: oracle plsql oracle11g


【解决方案1】:

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

【讨论】:

  • 如果打印 CLOB 变量与 DBMS_OUTPUT.put_line 有时打印有时会出错,是否有任何问题
  • ORA-06502: PL/SQL: numeric or value error 06502. 00000 - "PL/SQL: numeric or value error%s" *原因:算术、数字、字符串、转换或约束错误发生。例如,如果尝试将值 NULL 分配给声明为 NOT NULL 的变量,或者尝试将大于 99 的整数分配给声明为 NUMBER(2) 的变量,则会发生此错误。 *行动:更改数据、数据的操作方式或声明方式,以使值不会违反约束。
  • @Siddharth Jain DBMS_OUTPUT.put_line 与 CLOB 配合得很好,所以不要认为问题与相同。
  • 你检查了上面的代码我可能会遇到什么错误,因为它只指向 dbmsoutput 行
【解决方案2】:

你可以这样试试:

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;

也会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 2023-03-04
    • 2013-01-07
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多