2016-08-19 60 views
2

我想通过Scala中的Slick运行查询,该查询会将记录插入Oracle数据库并返回自动生成的ID作为结果。我发现这可以使用Slick的语法,但这可能使用普通的SQL查询吗?用下面的代码,我只能得到-1的返回值。Slick/Oracle PLAIN SQL在插入后获取自动生成的ID

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

我认为它更从Oracle的语法问题,请从Atilla [这里](http://stackoverflow.com/questions/34811283/retrieve-oracle-last-inserted-identity) –

+0

部分检查答案问题在于你的'declare new_person_id'缺少一个数据类型(可能是'tb_people.id%type'),所以这个块无法编译,也许这就是-1。但修复不会返回任何东西给调用者(我不知道斯卡拉)。 –

回答

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)