2016-08-19 67 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)