[PL/SQL]EXECUTE IMMEDIATE CREATE INDEX 失败,CREATE INDEX 选项无效
[PL/SQL]EXECUTE IMMEDIATE CREATE INDEX is failing with invalid CREATE INDEX option
对于每个 table_name 我需要根据从指定查询返回的 index_required 创建索引
我在下面写了PL/SQL程序:
DECLARE
sIndexRequired VARCHAR(50);
sTableName VARCHAR(50);
cSQL CLOB ;
BEGIN
FOR r IN [...] --I'm getting index_required and table_name from here
LOOP
sIndexRequired := r.index_required;
sTableName := r.table_name;
EXECUTE IMMEDIATE 'CREATE INDEX ' || sTableName ||
CASE WHEN sIndexRequired = 'XXX' THEN '_YYY'
[...] -- more case when cases
END
|| ' ON ' || sTableName || ' (' || sIndexRequired || ') TABLESPACE xyz;';
END LOOP;
END;
/
但是失败了
Error report -
ORA-02158: invalid CREATE INDEX option
ORA-06512: at line 46
ORA-06512: at line 46
02158. 00000 - "invalid CREATE INDEX option"
*Cause: An option other than COMPRESS, NOCOMPRESS, PCTFREE, INITRANS,
MAXTRANS, STORAGE, TABLESPACE, PARALLEL, NOPARALLEL, RECOVERABLE,
UNRECOVERABLE, LOGGING, NOLOGGING, LOCAL, or GLOBAL was specified.
*Action: Choose one of the valid CREATE INDEX options.
谁能知道我怎样才能完成这项工作?
谢谢,
迈克尔
目前,您是盲人并且不知道您在做什么。
而不是EXECUTE IMMEDIATE
,
- 声明局部
VARCHAR2
变量足够大以包含整个 CREATE INDEX
语句
- 编写语句并将其放入变量
- 在屏幕上显示其内容(使用
DBMS_OUTPUT.PUT_LINE
)
- copy/paste 并执行
- 如果第一眼看不清楚哪里出了问题,Oracle 现在会告诉您哪里出了问题。如果您使用 SQL*Plus,星号
*
将准确指向故障点
- 修复错误
- 运行程序再次
一旦您确定自己做对了,请删除 打印到屏幕 并使用 EXECUTE IMMEDIATE
.
如评论所述,结果是 EXECUTE IMMEDIATE
中的尾随 semi-colon 导致了问题。
No : || ') TABLESPACE xyz;';
Yes: || ') TABLESPACE xyz';
对于每个 table_name 我需要根据从指定查询返回的 index_required 创建索引 我在下面写了PL/SQL程序:
DECLARE
sIndexRequired VARCHAR(50);
sTableName VARCHAR(50);
cSQL CLOB ;
BEGIN
FOR r IN [...] --I'm getting index_required and table_name from here
LOOP
sIndexRequired := r.index_required;
sTableName := r.table_name;
EXECUTE IMMEDIATE 'CREATE INDEX ' || sTableName ||
CASE WHEN sIndexRequired = 'XXX' THEN '_YYY'
[...] -- more case when cases
END
|| ' ON ' || sTableName || ' (' || sIndexRequired || ') TABLESPACE xyz;';
END LOOP;
END;
/
但是失败了
Error report -
ORA-02158: invalid CREATE INDEX option
ORA-06512: at line 46
ORA-06512: at line 46
02158. 00000 - "invalid CREATE INDEX option"
*Cause: An option other than COMPRESS, NOCOMPRESS, PCTFREE, INITRANS,
MAXTRANS, STORAGE, TABLESPACE, PARALLEL, NOPARALLEL, RECOVERABLE,
UNRECOVERABLE, LOGGING, NOLOGGING, LOCAL, or GLOBAL was specified.
*Action: Choose one of the valid CREATE INDEX options.
谁能知道我怎样才能完成这项工作?
谢谢, 迈克尔
目前,您是盲人并且不知道您在做什么。
而不是EXECUTE IMMEDIATE
,
- 声明局部
VARCHAR2
变量足够大以包含整个CREATE INDEX
语句 - 编写语句并将其放入变量
- 在屏幕上显示其内容(使用
DBMS_OUTPUT.PUT_LINE
) - copy/paste 并执行
- 如果第一眼看不清楚哪里出了问题,Oracle 现在会告诉您哪里出了问题。如果您使用 SQL*Plus,星号
*
将准确指向故障点
- 如果第一眼看不清楚哪里出了问题,Oracle 现在会告诉您哪里出了问题。如果您使用 SQL*Plus,星号
- 修复错误
- 运行程序再次
一旦您确定自己做对了,请删除 打印到屏幕 并使用 EXECUTE IMMEDIATE
.
如评论所述,结果是 EXECUTE IMMEDIATE
中的尾随 semi-colon 导致了问题。
No : || ') TABLESPACE xyz;';
Yes: || ') TABLESPACE xyz';