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

 心情爱心_634 发布于 2023-02-08 14:35

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

1 个回答
  • 我不知道你到底想要什么,但也许你会尝试使用包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.

    2023-02-08 14:38 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有