我可以执行由分号与MySQL连接器/ J分隔的多个查询? [重复] 我可以执行由分号与MySQL

2019-05-12 03:47发布

这个问题已经在这里有一个答案:

  • 在单个语句在java中执行多个查询 6个回答

我对MySQL数据库JDBC驱动程序的版本5.1.25。

我想执行像这样的SQL查询:

statement.execute("select fullName from user where user_id=1; select fullName from user where user_id=2");

我总是收到异常:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select fullName from user where user_id=2' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2758)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:894)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:732)
    at dbViewer.model.UserConnectionManager.retrieveRoutinesNames1(UserConnectionManager.java:622)
    at dbViewer.model.UserConnectionManager.main(UserConnectionManager.java:637)

但是当我运行命令行此相同的查询(由分号分隔)它完美并输出两个表按预期方式。

Answer 1:

使用; 在大多数数据库不起作用,因为它通常不是语句的语法本身的一部分,但对于命令行或脚本输入到单独的语句终止查询。 在命令行或脚本处理器看到分号作为该语句是完整的,可被发送到服务器的信号。

另外,在JDBC单个语句准备(或执行)应该只有一个实际的语句,以便多个语句是不允许的,因此也没有必要有一个分号,并以此为某些(大多数?)数据库分号是不是语句的语法的一部分,它是一个简单的语法错误有一个包括在内。

如果要执行多个语句,你需要使用独立的执行。 从技术上讲,MySQL的确实有一个选项,以支持其可通过连接属性中启用多次执行。 这种行为不符合JDBC规范/ API,使你的代码的可移植性。 见allowMultiQueries的驱动程序/数据源类名,URL语法和配置属性连接器/ J



Answer 2:

我想执行像这样的SQL查询:

statement.execute("select fullName from user where user_id=1; select fullName from user where user_id=2");

这是可能的,只有当你设置一个数据库连接属性设置为允许多个查询一次执行。 而且属性名称是allowMultiQueries=true 。 这个属性被设置,并与数据库连接请求给服务器一起发送。 一般语法是这样的:

String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";

这是额外的连接属性,如果那些已经存在一些像autoReConnect=true

可接受值allowMultiQueries财产是truefalseyes ,和no 。 任何其他值是在与运行时被拒绝SQLException

你必须使用execute( String sql )或它的其他变体,以获取查询执行的结果。

multiQuerySqlString =  "select fullName from user where user_id=1; ";
multiQuerySqlString += "select fullName from user where user_id=2; ";
// you can multiple types of result sets
multiQuerySqlString += "select last_login from user_logs where user_id=1; ";

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

要遍历和处理结果您需要以下步骤:

int rsNumber = 0;
while ( hasMoreResultSets ) {  
    rsNumber += 1;
    Resultset rs = stmt.getResultSet();

    // based on the structure of the result set,
    // you can handle column values.
    if ( rsNumber == 1 ) {
      while( rs.next() ) {
          // handle your rs here
      } // while rs
    } // if rs is 1
    else if ( rsNumber == 2 ) {
      // call a method using this rs.
      processMyResultSet( rs ); // example
    } // if rs is 2
    // ... etc

    // check whether there exist more result sets  
    hasMoreResultSets = stmt.getMoreResults();  
} // while results

请参考

  • 在单个语句在java中执行多个查询
    • 一对这样类似的贴子,为此,我给了一个答案。


Answer 3:

不,你不能。 什么是你期待通过调用的Statement.execute(...)来获取? 它返回一个结果(...这意味着一个表)。

您可以直接打电话给geht回两个结果“从用户那里USER_ID(1,2)选择全名”。

有在JDBC声明分号是一般非常容易出错。 (如果你闭上你的SQL语句如IBM的JDBC驱动程序DB2 10.x中抛出一个异常“;”)一些JDBC驱动程序不支持此。



文章来源: Can I execute multiple queries separated by semicolon with MySQL Connector/J? [duplicate]
标签: java mysql jdbc