[PL/SQL]执行即时创建索引失败,创建索引选项无效

[PL/SQL]执行即时创建索引失败,创建索引选项无效,sql,oracle,indexing,plsql,execute-immediate,Sql,Oracle,Indexing,Plsql,Execute Immediate,对于每个表名,我需要根据指定查询返回的所需索引创建索引 我编写了以下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 sIndexR

对于每个表名,我需要根据指定查询返回的所需索引创建索引 我编写了以下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ł

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

而不是执行立即的

  • 声明本地
    VARCHAR2
    变量足够大,可以包含整个
    CREATE INDEX
    语句
  • 编写语句并将其放入变量中
  • 在屏幕上显示其内容(使用
    DBMS\u输出。输入行
  • 复制/粘贴并执行它
    • 如果一眼就不清楚哪里出了问题,甲骨文现在会告诉你哪里出了问题。如果使用SQL*Plus,星号
      *
      将精确地指向故障点
  • 修正错误
  • 再次运行该过程
一旦确定操作正确,请删除“打印到屏幕”并使用
executeimmediate


正如所评论的,原来是
executeimmediate
中的尾随分号导致了问题

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

这正是我第一次做的,我正在纠正,创建“创建索引”的工作,例如“在表上创建索引索引索引名称xxx\u名称(需要索引)表空间xyz”;所以您的回答不会有帮助。不幸的是,Oracle不同意您的意见。如果操作正确,它将创建索引,而不是返回错误。啊,是的-删除分号,此处:。。。表空间xyz;';就在
xyz后面的那个。然后再次运行代码。EXECUTE IMMEDIATE中的命令不能以分号结尾。这不是很好吗?