Slick/Oracle PLAIN SQL 插入后获取自动生成的 ID
Slick/Oracle PLAIN SQL Get auto generated ID after insert
我正在尝试 运行 通过 Scala 中的 Slick 进行查询,该查询会将记录插入 Oracle 数据库,并 return 自动生成 ID 作为结果。我看到这可以使用 Slick 的语法,但是使用普通的 SQL 查询可以吗?使用下面的代码,我只能得到 -1 的 return 值。
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])
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)
我正在尝试 运行 通过 Scala 中的 Slick 进行查询,该查询会将记录插入 Oracle 数据库,并 return 自动生成 ID 作为结果。我看到这可以使用 Slick 的语法,但是使用普通的 SQL 查询可以吗?使用下面的代码,我只能得到 -1 的 return 值。
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])
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)