我正在尝试通过Scala中的Slick运行查询,该查询将记录插入Oracle数据库并返回自动生成的ID作为结果。我看到使用Slick的语法可以实现这一点,但这是否可以使用普通的SQL查询?使用下面的代码我只能获得-1的返回值。
val name = "Bob"
db.run(sql"""DECLARE NEW_PERSON_ID;
BEGIN
INSERT INTO TB_PEOPLE (ID, NAME)
VALUES(SEQ_PEOPLE.NEXTVAL, $name)
RETURNING ID INTO NEW_PERSON_ID;
END;""".as[Int])
答案 0 :(得分:0)
似乎Slick不支持输出参数,因此使用Oracle的返回语法将不起作用。我找到的解决方法是首先生成一个ID,然后使用该ID插入(需要2个查询)。查询包含在事务中。
val name = "Bob"
val action = for {
newPersonId <- sql"""SELECT SEQ_PEOPLE.NEXTVAL FROM DUAL""".as[Int]
_ <- sqlu"""INSERT INTO TB_PEOPLE (ID, NAME) VALUES ($newPersonId, $name)"""
}
db.run(action.transactionally)