【问题标题】:ORA-06550 Why I can't create index inside the if-else in OracleORA-06550 为什么我不能在 Oracle 的 if-else 中创建索引
【发布时间】:2011-10-10 12:38:23
【问题描述】:

我不熟悉 PL/SQL。谁能解释为什么我不能执行以下操作?

BEGIN
  IF TRUE THEN
    CREATE INDEX TestIndex ON SomeTable (SomeColumn);
  END IF;
END;

我会收到以下错误:

错误报告: ORA-06550:第 3 行,第 5 列: PLS-00103:在预期以下情况之一时遇到符号“CREATE”: 开始 case 为 goto 声明退出 if loop mod null pragma 在使用时提高返回选择更新

我可以绕过这个错误的唯一方法是做动态sql:

BEGIN
  IF TRUE THEN
    EXECUTE IMMEDIATE 'CREATE INDEX TestIndex ON SomeTable (SomeColumn)';
  END IF;
END;

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    Oracle 不允许将 PL/SQL 块中的 DDL 作为静态 SQL,因此您已经确定了唯一的解决方法(好吧,从技术上讲,您可以使用 DBMS_SQL 而不是 EXECUTE IMMEDIATE,但您仍然需要处理动态 SQL) .

    我不知道他们不能在静态 SQL 中允许 DDL 有任何技术原因。但是由于 99% 的时间你不应该在存储过程中执行 DDL——创建对象几乎只在你进行部署而不是在运行时完成——迫使人们使用动态 SQL 使得开发人员停下来考虑他们是否真的在这 1% 的情况下这样的事情是有意义的。

    【讨论】:

    • 我实际上正在编写部署和数据库升级脚本。大多数使用这些脚本的人都没有 DBA 经验,我正在努力使脚本变得健壮,以便它可以重复而不会出错。所以,我需要执行 if else 逻辑来处理不同的场景。
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2021-01-14
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多