SEQUENCE - как быть?

Ashotovich

Новичок
SEQUENCE - как быть?

Всем привет.

Имеется следующая проблема.
Имеется две таблицы. В одну из них вносится запись под своим id. А затем необходимо в другую таблицу внести запись с тем же id. В первую таблицу запись вносится так:
PHP:
$query = "INSERT INTO ACTIVITIES VALUES (ACTIVITY_SEQ.nextval, '*всякие значения*')"; //ACTIVITY_SEQ.nextval - значение поля ACTIVITY_ID
$stmt = OCIParse($conn, $query);
             OCIExecute($stmt);
Так вот, подскажите, пожалуйста, как просто заполучить значение ACTIVITY_SEQ.nextval, внесенное в первом запросе?
Пока что у меня есть единственное решение - делается селект по всей первой таблице с сортировкой по ACTIVITY_ID и выбором последнего значения путем последовательного присвоения каждого из значений. А есть ли способ попроще?

Заранее спасибо.
Ashotovich.
 

Ashotovich

Новичок
Ок

А это самое <VAR> вставляется в PHP-скрипт? То есть если <VAR> будет называться $activity_id, я это самое $activity_id смогу использовать в дальнейшем теле скрипта?
 

Ashotovich

Новичок
Все понял. Надо еще туда OCIBindByName засунуть. Перед OCIExecute.

Спасибо! ;)
 

romutis

Guest
А вообще - лучше генерировать уникальный ID в триггере. Аппликухе - аппликухово, ораклу - ораклово. :)
 

Ashotovich

Новичок
Хех... В принципе, да. Но тогда придется каждый раз вычислять номер последней записи через SELECT. Лишняя операция...
 

romutis

Guest
Автор оригинала: Ashotovich
Хех... В принципе, да. Но тогда придется каждый раз вычислять номер последней записи через SELECT. Лишняя операция...
Ты это сам только что придумал? :)
Даже если ID (номер последней записи) генерируется "внутри" Оракла с помощью триггера - ты всегда можешь извлечь его, используя RETURNING <ID> INTO ...

Читай второе сообщение в этом топике.
 

Ashotovich

Новичок
Хехе... Это понятно. Ну так я говорю про то, что когда пользователь забредает в программу (сессию новую открывает то бишь), для вычисления значения последнего ID скрипту таки приходится лезть в таблицу селектом. ;)
 

romutis

Guest
А в каком случае не надо селектить таблицу, чтобы узнать максимальное значение поля? Если в отдельный момент с программой может работать лишь один человек, так? У тебя есть гарантированный механизм "знания" последнего ID без селекта? Если другой юзер добавил запись в таблицу - изменится ID или нет?
 

Ashotovich

Новичок
Изменится. Юзеров - 150 человек (будет 250). Таблица с ACTIVITY_ID - общая. Следущий пользователь добавляет новую запись в таблицу, ее ID присваивается на основе SEQUENCE. А уже этот ID в следующий запрос передается как ты вначале и написал (в другую таблицу надо внести некие данные, относящиеся к записи в первой таблице).
 

romutis

Guest
"не бачу логики" (С)

Какая у тебя проблема с ID, генерируемым с помощью SEQUENCE из аппликухи, и ID, генерируемым с помощью SEQUENCE из триггера?

В первом случае ты передаешь в составе полей для INSERT поле ID и в качестве значения ACTIVITY_SEQ.nextval, во втором случае - не передаешь ничего. Но в обоих случаях делаешь RETURNING ID INTO <your_var> и дальше уже манипулируешь значением переменной <your_var>.
Какие проблемы-то?
 

Ashotovich

Новичок
Так. Какое-то недопонимание случилось. Ты предлагаешь вычислять значение следующего ID в PHP-скрипте? Опиши поподробней, плиз. Я чего-то не догоняю.

Если идея в том, чтобы перед вставкой новой записи в скрипте вычислять значение следующего ID на основе последней записив таблицу, то могут возникнуть проблемы: пока один пользователь тормозит и держит значение следующего ID в скрипте, не добавляя запись в таблицу, второй может быстренько провести операцию и вставить запись с тем же ID. Откуда скрипту знать, что кто-то еще уже вычислил тот же ID?

Мде.
 

tony2001

TeaM PHPClub
Он предлагает не делать отдельный запрос, а повесить вычисление следующего ID на триггер.
Хотя, имхо, не надо тут триггера - можно вполне в INSERT выполнить функцию (или наоборот - в функции INSERT) и вернуть ID вставленной записи.
 

romutis

Guest
Ashotovich, у меня никакого недопонимания нету. :) Я всё, расписал, подробнее некуда. Почитай еще сообщение от Tony2001 - он прав (хотя триггер мне нравится больше - за последовательную генерацию ID в отличии от генерации на уровне аппликухи).
Но ты не заморачивайся такими наворотами - где и как лучше генерить ID из секвенса. :) Сделай хоть как-нибудь - да и закроем топик, а то такому ничтожному вопросу уже 10 сообщений посвятили.
 

tony2001

TeaM PHPClub
>Сделай хоть как-нибудь - да и закроем топик, а то такому ничтожному вопросу уже 10 сообщений посвятили.
жалко, что в форуме нельзя сделать /topic ...
я бы вынес эту фразу в топик =))
 
Сверху