【问题标题】:ORA-06550:identifier must be declaredORA-06550: 必须声明标识符
【发布时间】:2020-12-15 14:00:06
【问题描述】:

我有 PL/SQL 过程代码,当我尝试运行它失败时,我尝试用“创建或替换过程 create_index”替换 - 仍然是错误。

ORA-06550:3 第 2 行,第 3 列: ORA-06550:3 第 4 行,第 8 列: 必须声明标识符“IDXTS” 第 5 行,第 3 列: 行错误:INTO idxts ORA-06550:3 第 7 行,第 3 列: 必须声明标识符“CREATE_INDEX” 第 7 行,第 3 列:

DECLARE
  idxts VARCHAR2(100);

  PROCEDURE create_index(idx VARCHAR2, def VARCHAR2) IS
    fake NUMBER(1);
    BEGIN
      SELECT 1 INTO fake FROM user_indexes WHERE index_name = idx;
      EXCEPTION
        WHEN no_data_found THEN
          EXECUTE IMMEDIATE 'create index ' || idx || ' on ' || def || ' tablespace ' || idxts;
    END;

BEGIN
  SELECT
    nvl(min(value), 'NC_INDEXES')
  INTO idxts
  FROM nc_directory
  WHERE key = 'NC.TABLESPACE.INDEXES';
  create_index('IDX_QRTZ_T_ST_NFT', 'qrtz_triggers (trigger_state, next_fire_time)');
END;
/

BEGIN
  SELECT
    nvl(min(value), 'NC_INDEXES')
  INTO idxts
  FROM nc_directory
  WHERE key = 'NC.TABLESPACE.INDEXES';
  create_index('QRTZ_JOB_LISTENERSJOB_NAMEFK', 'qrtz_job_listeners (job_name)');
END;
/

BEGIN
  SELECT
    nvl(min(value), 'NC_INDEXES')
  INTO idxts
  FROM nc_directory
  WHERE key = 'NC.TABLESPACE.INDEXES';
  create_index('QRTZ_TRIGGERSJOB_NAMEFK', 'qrtz_triggers (job_name)');
END;
/

BEGIN
  SELECT
    nvl(min(value), 'NC_INDEXES')
  INTO idxts
  FROM nc_directory
  WHERE key = 'NC.TABLESPACE.INDEXES';
  create_index('QRTZ_TRIGGER_LISTENERSTRIGGEFK', 'qrtz_trigger_listeners (trigger_name, trigger_group)');
END;
/

【问题讨论】:

    标签: oracle stored-procedures plsql


    【解决方案1】:

    由于您拥有现有代码,因此过程create_index 将仅在第一个 PL/SQL 块中可用。尝试像这样将所有对create_index 的调用合并到一个 PL/SQL 块中。

    DECLARE
        idxts   VARCHAR2 (100);
    
        PROCEDURE create_index (idx VARCHAR2, def VARCHAR2)
        IS
            fake   NUMBER (1);
        BEGIN
            SELECT 1
              INTO fake
              FROM user_indexes
             WHERE index_name = idx;
        EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
                EXECUTE IMMEDIATE 'create index ' || idx || ' on ' || def || ' tablespace ' || idxts;
        END;
    BEGIN
        SELECT NVL (MIN (VALUE), 'NC_INDEXES')
          INTO idxts
          FROM nc_directory
         WHERE key = 'NC.TABLESPACE.INDEXES';
    
        create_index ('IDX_QRTZ_T_ST_NFT', 'qrtz_triggers (trigger_state, next_fire_time)');
        create_index ('QRTZ_JOB_LISTENERSJOB_NAMEFK', 'qrtz_job_listeners (job_name)');
        create_index ('QRTZ_TRIGGERSJOB_NAMEFK', 'qrtz_triggers (job_name)');
        create_index ('QRTZ_TRIGGER_LISTENERSTRIGGEFK','qrtz_trigger_listeners (trigger_name, trigger_group)');
    END;
    /
    

    【讨论】:

      【解决方案2】:

      我会这样重写你的代码:

      DECLARE
      
        PROCEDURE create_index(idx VARCHAR2, def VARCHAR2) IS
            idxts VARCHAR2(100);
            fake NUMBER(1);
          BEGIN
            SELECT
              nvl(min(value), 'NC_INDEXES')
            INTO idxts
            FROM nc_directory
            WHERE key = 'NC.TABLESPACE.INDEXES';
      
            SELECT 1 INTO fake FROM user_indexes WHERE index_name = idx;
      
          EXCEPTION
              WHEN no_data_found THEN
                EXECUTE IMMEDIATE 'create index ' || idx || ' on ' || def || ' tablespace ' || idxts;
          END;
      
      BEGIN
      
        create_index('IDX_QRTZ_T_ST_NFT', 'qrtz_triggers (trigger_state, next_fire_time)');
      
        create_index('QRTZ_JOB_LISTENERSJOB_NAMEFK', 'qrtz_job_listeners (job_name)');
      
        create_index('QRTZ_TRIGGERSJOB_NAMEFK', 'qrtz_triggers (job_name)');
      
        create_index('QRTZ_TRIGGER_LISTENERSTRIGGEFK', 'qrtz_trigger_listeners (trigger_name, trigger_group)');
      END;
      /
      

      【讨论】:

        【解决方案3】:

        每个 pl/sql 块都以“/”结尾。对于数据库,它意味着“现在执行上面的所有代码”。

        因此,当您运行此代码时,只有第一部分会被执行,而当它进入第二个 begin-end 块时,它会失败,因为它不知道这样的变量。

        所有你需要从第一个 plsql 部分复制“声明”部分到这个脚本中的所有开始-结束块

        【讨论】:

          猜你喜欢
          • 2015-10-30
          • 2015-02-06
          • 2014-05-26
          • 1970-01-01
          • 2013-08-31
          • 2022-01-06
          • 2021-02-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多