Anorm表示没有为插入前面的select查询返回结果(PSQLException:查询没有返回任何结果)

时间:2013-05-02 04:07:16

标签: postgresql scala anorm

我正在使用Postgres后端编写Play 2应用程序。

我的代码有一个sql字符串,它是两个插入和一个select的串联。然后当我尝试执行我的查询时,anorm爆炸并且说我没有返回任何结果。我可以将其分解为两个单独的查询,但之后我会不必要地访问数据库?

sql字符串非常简单。

val sql = """
        insert into gameconstants 
            ...
        values 
            ...;

        insert into gamevariables
            ...
        values
            ...;

        select lastval() as gameid;
  """  

然后抛出异常的代码只是试图从查询中获取gameid。这应该正常吗?

DB.withTransaction { implicit connection =>
  val gameid = SQL(sql).on(
    ... )()
    .map(row => row[Long]("gameid")).head
}  

错误 [PSQLException:查询未返回任何结果。]

1 个答案:

答案 0 :(得分:0)

正如其他评论所说,这是由向JDBC发布复合语句引起的。你有几个选择。

  1. 您可以执行JDBC批处理。正如克雷格上面所说,这只是分批发送每个查询。

  2. 您可以使用此逻辑编写用户定义的函数/存储过程,并在单个查询中调用。这具有将db逻辑封装在API后面的优点。缺点是没有很多注意力就很难维护存储过程和应用程序之间的契约。这是我在Perl中做的一些工作,但还没有用Java实现。

  3. 您可以将查询折叠为两个(您的代码显示三个)。简单的解决方案是:

    val query1 = """
        insert into gameconstants 
            ...
        values 
            ...;"""
    
    
    val query2 = """
        insert into gamevariables
            ...
        values
            ...
        RETURNING * 
     """  
    
  4. 这会在一定程度上减少往返次数。