动态 SQL - 检查语法和语义

2023-12-01

使用 Oracle 动态 SQL,我们可以执行包含 SQL 语句的字符串。例如

l_stmt := 'select count(*) from tab1';
execute immediate l_stmt;

是否可以不执行l_stmt但以编程方式检查语法和语义是否正确?


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 任务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态 SQL - 检查语法和语义 的相关文章

随机推荐