我想测试给定的sql语句在语法和语义上是否有效(即没有语法错误,没有字段拼写错误).
对于大多数数据库,Connection.prepareStatement和PreparedStatement.getMetaData都可以实现这一目的(无异常==良好查询).不幸的是,Oracle最新的驱动程序只解析SELECT查询,而不是其他类型的查询.年长的司机甚至不这样做.
Oracle是否提供了一些其他工具来解析sql语句?
您可以使用Oracle DBMS_sql包来解析字符串中保存的语句.例如:
原文链接:https://www.f2er.com/oracle/205709.htmlsql> 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)');