【问题标题】:[PL/SQL]EXECUTE IMMEDIATE CREATE INDEX is failing with invalid CREATE INDEX option[PL/SQL]EXECUTE IMMEDIATE CREATE INDEX 因 CREATE INDEX 选项无效而失败
【发布时间】:2021-01-30 19:47:12
【问题描述】:

对于每个 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.

谁能知道我怎样才能得到这项工作?

谢谢, 米哈乌

【问题讨论】:

    标签: sql oracle indexing plsql execute-immediate


    【解决方案1】:

    目前,你是盲人并且不知道你在做什么。

    而不是EXECUTE IMMEDIATE

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

    一旦你确定你做对了,删除打印到屏幕并使用EXECUTE IMMEDIATE


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

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

    【讨论】:

    • 这正是我首先要做的,而且我越来越正确,创建了工作“CREATE INDEX”,例如“CREATE INDEX index_name_xxx ON table_name (index_required) TABLESPACE _xyz;”所以你会回答无济于事
    • 很遗憾,Oracle 不同意您的看法。如果你做得正确,它将创建索引,而不是返回错误。
    • 啊,是的 - 删除分号,这里:... TABLESPACE xyz;'; xyz; 后面的那个。然后再次运行您的代码。
    • EXECUTE IMMEDIATE 中的命令不能以分号结尾。
    • 不是很好吗?
    猜你喜欢
    • 2012-01-23
    • 2021-04-15
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多