Oracle ORA-06550:必须声明标识符

Oracle ORA-06550:必须声明标识符,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我有PL/SQL过程代码,当我尝试运行它失败时,我尝试用“创建或替换过程create_index”替换它,但仍然是错误的 ORA-06550:3第2行第3列: ORA-06550:3第4行第8列: 必须声明标识符“IDXTS” 第5行第3列: 第行出错:输入idxts ORA-06550:3第7行第3列: 必须声明标识符“创建索引” 第7行第3列: DECLARE idxts VARCHAR2(100); PROCEDURE create_index(idx VARCHAR2, def

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

ORA-06550:3第2行第3列: ORA-06550:3第4行第8列: 必须声明标识符“IDXTS” 第5行第3列: 第行出错:输入idxts ORA-06550:3第7行第3列: 必须声明标识符“创建索引” 第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;
/

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

因此,当您运行这段代码时,只执行第一部分,当它转到第二个begin end块时,它会失败,因为它不知道这样一个变量


您只需在该脚本中的所有begin-end块中从第一个plsql部分复制“declare”部分即可

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

因此,当您运行这段代码时,只执行第一部分,当它转到第二个begin end块时,它会失败,因为它不知道这样一个变量


您只需在脚本中的所有开始-结束块中从第一个plsql部分复制“declare”部分,我会像这样重写您的代码:

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;
/

我会像这样重写您的代码:

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;
/

由于您拥有现有代码,因此过程
create\u index
将仅在第一个PL/SQL块中可用。尝试将所有对
create\u index
的调用组合到一个PL/SQL块中,如下所示

声明
idxts VARCHAR2(100);
创建索引的过程(idx VARCHAR2,def VARCHAR2)
是
假号码(1);
开始
选择1
伪造
从用户索引
其中索引_name=idx;
例外情况
当找不到数据时
然后
在“| def | | |表空间”| idxts上立即执行“创建索引”| idx | |;
结束;
开始
选择NVL(最小值),“NC\U索引”)
进入idxts
从nc\U目录
其中key='NC.TABLESPACE.index';
创建索引(“IDX\U QRTZ\U T\U ST\U NFT”,“QRTZ\U触发器(触发器状态,下一次点火时间)”;
创建索引(“QRTZ\u作业侦听器作业名称fk”、“QRTZ\u作业侦听器(作业名称)”;
创建索引(“QRTZ\u触发器job\u NAMEFK”、“QRTZ\u触发器(作业名称)”;
创建索引(“QRTZ\u触发器\u侦听器striggefk',“QRTZ\u触发器\u侦听器(触发器名称,触发器组)”;
结束;
/

由于您拥有现有的代码,因此过程
创建索引
将仅在第一个PL/SQL块中可用。尝试将所有对
create\u index
的调用组合到一个PL/SQL块中,如下所示

声明
idxts VARCHAR2(100);
创建索引的过程(idx VARCHAR2,def VARCHAR2)
是
假号码(1);
开始
选择1
伪造
从用户索引
其中索引_name=idx;
例外情况
当找不到数据时
然后
在“| def | | |表空间”| idxts上立即执行“创建索引”| idx | |;
结束;
开始
选择NVL(最小值),“NC\U索引”)
进入idxts
从nc\U目录
其中key='NC.TABLESPACE.index';
创建索引(“IDX\U QRTZ\U T\U ST\U NFT”,“QRTZ\U触发器(触发器状态,下一次点火时间)”;
创建索引(“QRTZ\u作业侦听器作业名称fk”、“QRTZ\u作业侦听器(作业名称)”;
创建索引(“QRTZ\u触发器job\u NAMEFK”、“QRTZ\u触发器(作业名称)”;
创建索引(“QRTZ\u触发器\u侦听器striggefk',“QRTZ\u触发器\u侦听器(触发器名称,触发器组)”;
结束;
/