错误处理脚本声明失败

问题描述 投票:0回答:1

我正在创建一个过程来处理我的 sql 脚本的错误,但声明失败。不知道是什么问题。

`    
DECLARE
PROCEDURE EXEC (i_statement IN VARCHAR2, i_ignore IN NUMBER DEFAULT NULL, i_ignore2 IN NUMBER DEFAULT NULL)
    IS
      BEGIN
        EXECUTE IMMEDIATE (i_statement);  
    EXCEPTION
        WHEN OTHERS THEN
          IF SQLCODE = i_ignore THEN NULL;
        ELSIF SQLCODE = i_ignore2 THEN NULL;
        ELSE
          RAISE;
        END IF;
      END;
    /
    DECLARE
      TYPE tt_table_name IS TABLE OF VARCHAR2(30);
      --
      -- List of all tables where column addition is required.
      --
      ct_tab_prpc_data tt_table_name := tt_table_name (
                                          -- List of tables.
                                          'PR_OPERATORS_BKP2',
                                              'PR_OPERATORS_BKP3',
                                          'PR_OPERATORS_BKP4'
                                     );
      --
      v_db_name         VARCHAR2(30);
      v_schema_name     VARCHAR2(30) := USER;
      v_idx             VARCHAR2(30);
    BEGIN
      SELECT UPPER(SYS_CONTEXT('USERENV', 'DB_NAME')) INTO v_db_name FROM DUAL;
         v_idx := ct_tab_prpc_data.FIRST;
        WHILE v_idx IS NOT NULL LOOP
            --execute immediate 'Alter table '||ct_tab_prpc_data(v_idx)||' add(CSCLEVEL VARCHAR2(500))';
            EXEC('Alter table ''||ct_tab_prpc_data(v_idx)||'' add(CSCLEVEL VARCHAR2(500))',-01430,-00942);
          v_idx := ct_tab_prpc_data.NEXT(v_idx);
        END LOOP;
END;
    /`

错误报告 -
ORA-06550: 第 21 行,第 3 列:
PLS-00201:必须声明标识符“EXEC”
ORA-06550: 第 21 行,第 3 列:
PL/SQL:忽略语句
06550. 00000 - “第 %s 行,第 %s 列: %s”
*原因:通常是 PL/SQL 编译错误。
*行动:

plsql
1个回答
0
投票

是“/”和第二个

DECLARE
把它弄乱了。嵌套子程序(在匿名 pl/sql 块的声明部分中声明的 exec 过程)位于变量声明之后。

DECLARE
    TYPE tt_table_name IS
        TABLE OF VARCHAR2(30);
      --
      -- List of all tables where column addition is required.
      --
    ct_tab_prpc_data tt_table_name := tt_table_name(
                                          -- List of tables.
                                          'PR_OPERATORS_BKP2',
                                          'PR_OPERATORS_BKP3',
                                          'PR_OPERATORS_BKP4'
                                      );
      --
    v_db_name        VARCHAR2(30);
    v_schema_name    VARCHAR2(30) := user;
    v_idx            VARCHAR2(30);
    PROCEDURE exec (
            i_statement IN VARCHAR2
           ,i_ignore    IN NUMBER DEFAULT NULL
           ,i_ignore2   IN NUMBER DEFAULT NULL
        ) IS
        BEGIN
            --EXECUTE IMMEDIATE ( i_statement );
            dbms_output.put_line(i_statement);
        EXCEPTION
            WHEN OTHERS THEN
                IF sqlcode = i_ignore THEN
                    NULL;
                ELSIF sqlcode = i_ignore2 THEN
                    NULL;
                ELSE
                    RAISE;
                END IF;
        END;        
BEGIN
    SELECT upper(
        sys_context(
            'USERENV'
           ,'DB_NAME'
        )
    )
      INTO v_db_name
      FROM dual;

    v_idx := ct_tab_prpc_data.first;
    WHILE v_idx IS NOT NULL LOOP
            --execute immediate 'Alter table '||ct_tab_prpc_data(v_idx)||' add(CSCLEVEL VARCHAR2(500))';
        exec(
            'Alter table '||ct_tab_prpc_data(v_idx)||' add(CSCLEVEL VARCHAR2(500))'
           ,-01430
           ,-00942
        );
        v_idx := ct_tab_prpc_data.next(v_idx);
    END LOOP;

END;
/

请注意,

EXEC('Alter table ''||ct_tab_prpc_data(v_idx)||'' add(CSCLEVEL VARCHAR2(500))',-01430,-00942);
中有太多引号。要么不要引用表名,要么用双引号括起来。

© www.soinside.com 2019 - 2024. All rights reserved.