oracle - 将 SQL 解析为 Oracle JDBC 驱动程序

标签 oracle jdbc oracle10g

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

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

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

最佳答案

您可以使用 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)');

关于oracle - 将 SQL 解析为 Oracle JDBC 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3873322/

相关文章:

oracle - 每小时自动运行一次oracle程序

oracle - Tomcat 连接池概念和 c3p0 连接池?

oracle - 使用 grails 1.3 到 Oracle 的 JNDI 数据源

sql - ORA-01843 : not a valid month with data type conversion

即使使用 'autoReconnect=true' MySql JDBC 超时

java - 从 AccessDB 中提取数据时出现的问题

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure

oracle10g - 通配符查询扩展导致术语过多

sql - 如何在 SQLdeveloper 中保存表的过滤器?

Oracle:通过联合等组合两个group by查询(使用聚合函数count())以获得合并结果