我正在使用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:查询未返回任何结果。]
答案 0 :(得分:0)
正如其他评论所说,这是由向JDBC发布复合语句引起的。你有几个选择。
您可以执行JDBC批处理。正如克雷格上面所说,这只是分批发送每个查询。
您可以使用此逻辑编写用户定义的函数/存储过程,并在单个查询中调用。这具有将db逻辑封装在API后面的优点。缺点是没有很多注意力就很难维护存储过程和应用程序之间的契约。这是我在Perl中做的一些工作,但还没有用Java实现。
您可以将查询折叠为两个(您的代码显示三个)。简单的解决方案是:
val query1 = """
insert into gameconstants
...
values
...;"""
val query2 = """
insert into gamevariables
...
values
...
RETURNING *
"""
这会在一定程度上减少往返次数。