Oracle ORA-06550:必须声明标识符
我有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列: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
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侦听器(触发器名称,触发器组)”;
结束;
/