动态SQL - 检查语法和语义

时间:2016-04-19 08:56:44

标签: sql oracle dynamic-sql

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

['about', 'mission', 'path', 'standard', 'getting_started', 'welcome', 'infection', 'instruction', 'implementation']

是否可以不执行get page, to: "pages##{page}"但是检查语法和语义是否正确?

3 个答案:

答案 0 :(得分:1)

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

手册中的语法图表示它应该运行所有语句。但是,似乎至少有一些语句类型不起作用,例如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任务。

答案 1 :(得分:0)

我认为这是唯一的解决方案"是使用DBMS_SQL.PARSE()

它并不完美,但它是你能得到的最好的

答案 2 :(得分:-1)

希望通过这种方式可以检查执行前形成的查询。

O(N)