[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';