我正在用Java编写一个工具,它将语句提交给数据库,这些数据库稍后运行.我正在使用JDBC连接到数据库.该数据库是Oracle 10g.
在将语句写入数据库之前,我想解析它们以检查它们何时运行以后不会出现问题.我考虑使用ANTLR解决方案,因为有可用的语法,但肯定如果我有数据库的连接,必须有一种方法来使用解析器内置的数据库.
基本上我的问题是:
有没有办法使用JDBC我可以调用数据库解析器传递一个SQL语句,它会返回一些反馈,告诉我它是否成功或任何错误消息?
非常感谢任何帮助,非常感谢.
编辑:
使用connection.prepareStatement似乎不起作用,例如此输出已成功解析!
String statement = "WHERE DISTINCT SELECT"; Connection connection; try { connection = this.controller.getDataSource().getConnection(); connection.prepareStatement(statement); connection.close(); mainPanel.setPositiveText("Parsed Successfully!"); } catch (Exception e) { mainPanel.setNegativeText("ERROR: " + e.getMessage()); return; }
我使用的灵魂如下:
String statement = "DECLARE " + "myNumber NUMBER; " + "BEGIN " + "myNumber := SYS.dbms_sql.open_cursor; " + "SYS.DBMS_SQL.PARSE(myNumber, '" + text + "', SYS.DBMS_SQL.NATIVE); " + "END;"; Connection connection; try { connection = this.controller.getDataSource().getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(statement); preparedStatement.execute(); connection.close(); mainPanel.setPositiveText("Parsed Successfully!"); } catch (Exception e) { mainPanel.setNegativeText("ERROR: " + e.getMessage()); System.out.println(e.getMessage()); return; }
ibre5041.. 7
我不知道你到底想要什么,但也许你会尝试使用包DBMS_SQL
和它的方法PARSE
.这仅适用于DML 语句.这就是Oracle SQL Developer的功能.
此解析器也可用于DML语句.对于PL/SQL,它需要一些调整.据我所知,没有人花足够的时间为Oracle的DDL创建一个真正完全验证的解析器.
以下是我如何使用它的示例:
declare l_cursor number := dbms_sql.open_cursor; l_offset number := -1 ; begin begin dbms_sql.parse( l_cursor, :st, dbms_sql.native ); exception when others then l_offset := dbms_sql.last_error_position; end; dbms_sql.close_cursor( l_cursor ); :off := l_offset; end;
只需执行此块.传递一个VARCHAR2(String)类型的输入参数(最大32KB)和一个输出参数NUMBER.
我不知道你到底想要什么,但也许你会尝试使用包DBMS_SQL
和它的方法PARSE
.这仅适用于DML 语句.这就是Oracle SQL Developer的功能.
此解析器也可用于DML语句.对于PL/SQL,它需要一些调整.据我所知,没有人花足够的时间为Oracle的DDL创建一个真正完全验证的解析器.
以下是我如何使用它的示例:
declare l_cursor number := dbms_sql.open_cursor; l_offset number := -1 ; begin begin dbms_sql.parse( l_cursor, :st, dbms_sql.native ); exception when others then l_offset := dbms_sql.last_error_position; end; dbms_sql.close_cursor( l_cursor ); :off := l_offset; end;
只需执行此块.传递一个VARCHAR2(String)类型的输入参数(最大32KB)和一个输出参数NUMBER.