0

我正在编写一个带有 Postgres 后端的 Play 2 应用程序。

我的代码有一个 sql 字符串,它是两个插入和一个选择的串联。然后当我尝试执行我的查询时,异常会爆炸并说我没有返回任何结果。我可以把它分成两个单独的查询,但是我会不必要地访问数据库吗?

sql 字符串非常简单。

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

        insert into gamevariables
            ...
        values
            ...;

        select lastval() as gameid;
  """  

然后抛出异常的代码只是尝试从查询中获取游戏 ID。这应该有效吗?

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

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

4

1 回答 1

0

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

  1. 你可以做一个 JDBC 批处理。正如上面 Craig 所指出的,这只是批量单独发送每个查询。

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

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

    val query1 = """
        insert into gameconstants 
            ...
        values 
            ...;"""
    
    
    val query2 = """
        insert into gamevariables
            ...
        values
            ...
        RETURNING * 
     """  
    

这将在一定程度上减少您的往返行程。

于 2013-06-04T05:51:11.070 回答