当前位置: 首页 > 知识库问答 >
问题:

我可以使用MySQL连接器/J执行多个以分号分隔的查询吗?[副本]

杜茂
2023-03-14

我的mysql db 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)

但当我从命令行运行这个相同的查询(用分号分隔)时,它工作得很好,并按预期输出了两个表。

共有3个答案

班玉堂
2023-03-14

不,你不能。你希望通过调用语句得到什么。执行(…)?它返回一个ResultSet(…表示一个表)。

您只需调用“select fullName from user where user\u id in(1,2)”,即可返回这两个结果。

在JDBC语句中使用分号通常非常容易出错。一些JDBC驱动程序不支持这一点(例如,IBMDB2 10. x的JDBC驱动程序会在您使用“;”关闭SQL语句时引发异常)。

单嘉泽
2023-03-14

我想这样执行sql查询:

语句。执行(“从user\u id=1的用户中选择全名;从user\u id=2的用户中选择全名”)

只有当您将一个数据库连接属性设置为允许同时执行多个查询时,这才可能实现。属性名为allowMultiQueries=true。必须设置此属性,并将其与数据库连接请求一起发送到服务器。一般语法如下:

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

这是对那些已经存在的属性的附加连接属性,例如autoReConnect=true等。

allowMultiQueries属性的可接受值为true、false、yes和no。任何其他值在运行时都会被拒绝,并出现SQLException。

您必须使用执行(字符串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中以单个语句执行多个查询
濮阳征
2023-03-14

在大多数数据库的查询中使用不起作用,因为它通常不是语句语法本身的一部分,而是命令行或脚本输入到单独语句的终止符。命令行或脚本处理器将分号视为语句完成并可以发送到服务器的信号。

此外,在JDBC中,单个语句prepare(或execute)应该只有一个实际语句,因此不允许有多个语句,因此也不需要分号,对于某些语句(大多数?)数据库分号不是语句语法的一部分,包含分号只是一个语法错误。

如果要执行多个语句,则需要使用单独的执行。从技术上讲,MySQL确实有支持多个执行的选项,可以通过连接属性启用。这种行为不符合JDBC规范/API,并且会降低代码的可移植性。有关连接器的驱动程序/数据源类名、URL语法和配置属性,请参见

 类似资料:
  • 我试图在mysql中创建一个存储过程,它在每个请求中创建一个新表,从另一个表中复制内容,提取所需的数据,最后删除该表。存储过程相当大,所以我不可能在每个查询之后都执行,因此我试图以分号分隔的格式一起执行查询。但在最终执行时,我得到错误代码:1064。我正在尝试的方法是否可行,或者是否有更好的方法。

  • 问题内容: 我正在尝试在我的SQL Server数据库中合并这样的内容: 变成这个: 我需要在SQL Server和Oracle中都这样做。 我发现MySQL的功能完全可以满足我的需要,但是MySQL并不是这里的选择。 编辑: 测试台: 问题答案: 这是在SQL Server 2005+中可以使用的解决方案: 参考: STUFF(Transact-SQL)

  • 问题内容: 长话短说:我在多个表中需要收集数据,为了不必绘制大表,我对其进行了简化。 我需要在一个查询中执行此操作,并且不能使用PHP或任何其他语言来处理结果。(如果我可以简单地解决这一问题,我会使用PHP) 如果我要有一个将t1行连接到t2的链接表,这不会是一个问题,但是不幸的是,我也没有,也不能引入任何一个。 可以将多个用户连接到同一资源,并且用户可以访问一个或多个资源。 我想要一个接近的结果

  • 问题内容: 我的表格中有一个字段,其中包含逗号分隔的字符串,例如。每个数字代表可用的颜色。 运行查询以获取所有红色衬衫(颜色= 1)时,我还会获取颜色为灰色(= 12)和橙色(= 15)的衬衫。 我应该如何重写查询,以便仅选择颜色1而不是选择所有包含数字1的颜色? 问题答案: 经典方法是在左右添加逗号: 但是find_in_set也可以:

  • 问题内容: 想象一个有多列的表,例如。我通常按​​进行选择,但是,客户端应用程序中有多个查询,它们对列的子集使用各种条件。 当MySQL在多列有多个WHERE条件的单个表上执行查询时,它真的可以利用在不同列上创建的索引吗?还是使其快速的唯一方法是为所有可能的查询创建多列索引? 问题答案: 是的,MySQL可以对单个查询使用多个索引。优化器将确定哪些索引将使查询受益。您可以用来获取有关MySQL如何

  • 问题内容: 使用,我可以做类似的事情: 我的输出: 但是我只想要1行1列: 预期产量: 原因是我要从多个表中选择多个值,并且在所有联接之后,我得到的行比我想要的要多得多。 我在MySQL Doc上寻找了一个函数,但看起来不像或函数接受结果集。 那么,这里有人知道该怎么做吗? 问题答案: 您可以使用: 正如路德维希(Ludwig)在其评论中所述,您可以添加运算符以避免重复: 正如Jan在他们的评论中