[PL/SQL]EXECUTE IMMEDIATE CREATE INDEX失败,CREATE INDEX选项无效



对于每个表名,我需要根据指定查询返回的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.

有人知道我该怎么做吗?

谢谢,Michał

目前,您是盲人,不知道自己在做什么。

代替EXECUTE IMMEDIATE

  • 声明足够大的局部VARCHAR2变量以包含整个CREATE INDEX语句
  • 编写语句并将其放入变量中
  • 在屏幕上显示其内容(使用DBMS_OUTPUT.PUT_LINE(
  • 复制/粘贴并执行
    • 如果第一眼不清楚出了什么问题,Oracle现在会告诉您出了什么错误。如果使用SQL*Plus,星号*将准确地指向故障点
  • 修复错误
  • 再次运行该过程

确定操作正确后,删除打印到屏幕并使用EXECUTE IMMEDIATE


正如所评论的,事实证明是EXECUTE IMMEDIATE中的尾随分号造成了问题。

No : || ') TABLESPACE xyz;';
Yes: || ') TABLESPACE xyz';

相关内容

  • 没有找到相关文章

最新更新