java - 使用 JDBC 从 Java 使用 Oracle 数据库解析器

标签 java oracle jdbc

我正在用 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;
    }

我用的soultion如下:

    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;
    }

最佳答案

我不知道你到底想要什么,但也许你可以尝试使用包 DBMS_SQL 和它的方法 PARSE。这仅适用于 DML 语句。这就是 Oracle SQL Developer 所做的。

parser也可以用于 DML 语句。对于 PL/SQL,它需要一些调整。据我所知,没有人花足够的时间为 Oracle 的 DDL 创建一个真正的完全验证解析器。

Here是我如何使用它的一个例子:

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;

简单地执行这个 block 。传递一个 VARCHAR2(String) 类型的输入参数(最大 32KB)和一个输出参数 NUMBER。

关于java - 使用 JDBC 从 Java 使用 Oracle 数据库解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20745010/

相关文章:

java - 为什么在循环使用字段引用之前将其复制到本地?

oracle - 如何在 SQL Developer 中读取本地文件?

sql - 在 Oracle 中排序 VARCHAR2 日期

java - 查询数据库中的对象列表,以便从该列表创建对象 : proper way to do

java - 是否可以使用 Glassfish 应用服务器运行 gRPC?

java - 如何从 tmdb json feed 加载电影图像

linux - 在 Sqlplus 中运行 Linux 函数

java - 如何将 MySQL 表的列的值检索到代码中?

java - JTable/JDBC 在 Eclipse 之外无法工作

java - jdbc INSERT 到主键是自动编号的 MS Access 表中