【问题标题】:Parse SQL via Oracle's JDBC driver将 SQL 解析为 Oracle JDBC 驱动程序
【发布时间】:2011-04-21 20:39:10
【问题描述】:

我想测试给定的 SQL 语句在语法和语义上是否有效(即没有语法错误和字段拼写错误)。

对于大多数数据库,Connection.prepareStatementPreparedStatement.getMetaData 可以解决问题(没有例外 == 好的查询)。不幸的是,Oracle 的最新驱动程序只解析 SELECT 查询,而不解析其他类型的查询。老司机甚至不这样做。

Oracle 是否提供了其他一些工具来解析 SQL 语句?

【问题讨论】:

    标签: oracle jdbc oracle10g


    【解决方案1】:

    您可以使用 Oracle DBMS_SQL 包来解析字符串中的语句。例如:

    SQL> declare
      2    c integer;
      3    l_statement varchar2(4000) := 'insert into mytable (col) values (1,2)';
      4  begin
      5    c := dbms_sql.open_cursor;
      6    dbms_sql.parse(c,l_statement,dbms_sql.native);
      7    dbms_sql.close_cursor(c);
      8  end;
      9  /
    declare
    *
    ERROR at line 1:
    ORA-00913: too many values
    ORA-06512: at "SYS.DBMS_SYS_SQL", line 824
    ORA-06512: at "SYS.DBMS_SQL", line 32
    ORA-06512: at line 6
    

    您可以将其包装到刚刚返回的存储函数中,例如1 表示语句有效,0 表示无效,如下所示:

    function sql_is_valid
      ( p_statement varchar2
      ) return integer
    is  
      c integer;
    begin
      c := dbms_sql.open_cursor;
      dbms_sql.parse(c,p_statement,dbms_sql.native);
      dbms_sql.close_cursor(c);
      return 1;
    exception
      when others then 
        return 0;
    end;
    

    然后你可以像下面这个 PL/SQL 示例一样使用它:

    :n := sql_is_valid('insert into mytable (col) values (1,2)');
    

    【讨论】:

    • 哇哦!看起来不错,明天试试:)谢谢!
    • 它有一个“次要”的缺点,如果你尝试一个由这个函数检查的 DDL(比如创建表),DDL 会被执行。例如。 sql_is_valid('创建表测试(id int)');实际上创建了一个表但是可以通过向您测试的字符串添加解释计划来绕过它(如果您的用户有plan_table)
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多