我不是PL/SQL的家人.任何人都可以解释为什么我不能做以下事情?
BEGIN
IF TRUE THEN
CREATE INDEX TestIndex ON SomeTable (SomeColumn);
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
我会收到以下错误:
错误报告:ORA-06550:第3行,第5列:PLS-00103:当遇到以下情况之一时遇到符号"CREATE":如果循环mod为空pragma raise返回选择更新,则使用<<开关大小写声明退出当前删除fetch lock insert open rollback savepoint set sql execute commit forall merge pipe 06550. 00000 - "line%s,column%s:\n%s"*原因:通常是PL/SQL编译错误.*行动:
我可以通过传递此错误的唯一方法是动态sql:
BEGIN
IF TRUE THEN
EXECUTE IMMEDIATE 'CREATE INDEX TestIndex ON SomeTable (SomeColumn)';
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
Oracle不允许将PL/SQL块中的DDL作为静态SQL,因此您已经确定了唯一的解决方法(从技术上讲,您可以使用DBMS_SQL而不是EXECUTE IMMEDIATE,但您仍然在处理动态SQL).
我不知道有任何技术原因他们不能在静态SQL中允许DDL.但是,由于99%的时间你不应该在存储过程中执行DDL - 创建对象几乎完全是在你进行部署而不是在运行时完成时 - 强迫人们使用动态SQL make开发人员停下来考虑他们是否真的处于这种情况有意义的1%的情况下.
| 归档时间: |
|
| 查看次数: |
2276 次 |
| 最近记录: |