EXPLAIN PLAN将检查几乎所有类型的 SQL 语句的语法和语义。并且不像DBMS_SQL.PARSE
它不会隐式执行任何事情。
解释计划的重点是展示Oracle将如何执行一条语句。作为生成计划的副作用,它还必须检查语法、权限,并且通常会执行除实际运行语句之外的所有操作。解释计划本身是没有意义的,可以忽略,该语句只是运行来检查是否有错误。只要没有错误,该声明就是有效的。
例如,下面的 PL/SQL 块检查SELECT
声明和一份CREATE TABLE
陈述。它们运行时没有错误,因此语法很好。
begin
execute immediate 'explain plan for select * from dual';
end;
/
begin
execute immediate 'explain plan for create table just_some_table(a number)';
end;
/
运行错误的语句将产生错误。至少在这一个测试用例中,它会生成与该语句自行运行相同的错误。
begin
execute immediate 'explain plan for select * from this_table_does_not_exist';
end;
/
ORA-00942: table or view does not exist
ORA-06512: at line 2
手册中的语法图意味着它应该运行all声明。但是,似乎至少有一些语句类型不起作用,例如ALTER SESSION
.
begin
execute immediate 'explain plan for alter session set optimizer_features_enable = ''11.2.0.4''';
end;
/
ORA-00900: invalid SQL statement
ORA-06512: at line 2
有点偏离主题 - 您是否正在尝试构建一个完全通用的 SQL 接口,例如在 PL/SQL 中构建的私有 SQL Fiddle?您是否需要担心诸如阻止用户尝试运行某些语句类型以及确保没有尾随分号之类的问题?如果是这样,我可以编辑问题来帮助完成一些困难的动态 SQL 任务。