2016-08-19 1 views
2

Я пытаюсь запустить запрос через Slick в Scala, который вставляет запись в db Oracle и возвращает автоматически сгенерированный идентификатор в качестве результата. Я вижу, что это возможно с использованием синтаксиса Slick, но возможно ли это, используя простой SQL-запрос? С приведенным ниже кодом я могу получить только возвращаемое значение -1.Slick/Oracle PLAIN SQL Получить автоматически сгенерированный идентификатор после вставки

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 не будет работать. Обходной путь, который я нашел, - сначала сгенерировать идентификатор, а затем вставить его с помощью этого идентификатора (требуется 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)