Получить идентификатор автоинкремента через ODBC - PullRequest
1 голос
/ 24 февраля 2011

Я добавляю новые функции в унаследованное приложение, написанное на PHP, которое использует базу данных Oracle 9i через функции ODBC .Я создал таблицу с последовательностью и триггером для генерации идентификаторов с автоинкрементом.

Сейчас я пытаюсь найти способ сделать вставку и получить сгенерированный идентификатор впоследствии:

Нужно ли жестко кодировать имя последовательности и использовать SEQ_NAME.CURRVAL в оставшейся части транзакции?Что мне нужно сделать, чтобы убедиться, что я получаю правильное значение, даже если есть одновременный доступ?

Обновление: добавлен третий пункт к неудачным попыткам

1 Ответ

3 голосов
/ 24 февраля 2011

Лучше всего было бы кодировать эту вставку как PL / SQL API на стороне базы данных, которая вернет вам идентификатор для использования. например.)

create function insert_yourtable(p_f1 number, p_f2 varchar2, ... p_fn varchar2)
return number
   idval number;
begin
   insert into yourtable(f1, f2,...fn)
   values (p_f1, p_f2, ...p_fn)
   returning your_id_value into idval;
   return idval;
end;
/

Тогда вы могли бы назвать это подготовленным оператором, чтобы получить выходной параметр и использовать идентификатор для остальной части вашей транзакции.

Ой - только что увидела комментарий "No OUT params ...."

Хорошо, тогда, я думаю, вам нужно управлять всем этим из пользовательского интерфейса. Сбрось триггер со стола, сделай

select yourseq.nextval from dual;

чтобы получить следующее доступное значение ключа, сохранить его локально, а затем выполнить всю работу самостоятельно, используя полученный идентификатор для вставки в поле идентификатора в таблице. Последовательность обеспечит безопасность транзакций для идентификатора.

Какая боль в прикладной реализации ODBC!

...