通过Oracle的JDBC驱动程序解析SQL
发布时间:2020-12-12 13:51:24 所属栏目:百科 来源:网络整理
导读:我想测试给定的SQL语句在语法和语义上是否有效(即没有语法错误,没有字段拼写错误). 对于大多数数据库,Connection.prepareStatement和PreparedStatement.getMetaData都可以实现这一目的(无异常==良好查询).不幸的是,Oracle最新的驱动程序只解析SELECT查询,而
我想测试给定的SQL语句在语法和语义上是否有效(即没有语法错误,没有字段拼写错误).
对于大多数数据库,Connection.prepareStatement和PreparedStatement.getMetaData都可以实现这一目的(无异常==良好查询).不幸的是,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)'); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |