gpt4 book ai didi

sql - 动态 SQL - 检查语法和语义

转载 作者:行者123 更新时间:2023-12-03 22:14:11 24 4
gpt4 key购买 nike

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

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

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

最佳答案

EXPLAIN PLAN将检查几乎所有类型的 SQL 语句的语法和语义。与 DBMS_SQL.PARSE 不同,它不会隐式执行任何内容。

解释计划的重点是展示 Oracle 将如何执行一条语句。作为生成计划的副作用,它还必须检查语法、权限,并且通常执行除了实际运行语句之外的所有操作。解释计划本身没有意义,可以忽略,运行该语句只是为了检查是否有任何错误。只要没有错误,声明就是有效的。

例如,下面的 PL/SQL block 检查 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

手册中的语法图暗示它应该为所有 语句运行。但是,似乎至少有一些语句类型不起作用,例如 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 接口(interface),例如在 PL/SQL 中构建的私有(private) SQL Fiddle?您是否需要担心诸如阻止用户尝试运行某些语句类型以及确保没有尾随分号之类的事情?如果是这样,我可以编辑问题以帮助完成一些困难的动态 SQL 任务。

关于sql - 动态 SQL - 检查语法和语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36713444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com