2016-08-19 5 views
2

後に自動でIDが生成されます。私はSlickの構文を使用してこれが可能であることを知っていますが、これは単純なSQLクエリを使用して可能ですか?以下のコードでは、-1の戻り値しか得られません。スリック/オラクルPLAIN SQLは、私は、Oracle DBにレコードを挿入し、自動結果としてIDを生成し返しますScalaではスリックを経由してクエリを実行しようとしています挿入

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構文からのより多くの問題だと思う、アッティラからの回答を確認してください[ここ](http://stackoverflow.com/questions/34811283/retrieve-oracle-last-inserted-identity) –

+0

パート問題の 'declare new_person_id'がデータ型(たぶん' tb_people.id%type')を欠いているので、ブロックがコンパイルに失敗し、おそらく-1が与えられます。しかし、それを修正することは、呼び出し元に何も返されません(そして私はScalaを知らない)。 –

答えて

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) 
関連する問題