У нас есть БД с несколькими таблицами, имеющими столбец "последовательного" типа. Унаследованное приложение C записывает данные в эти таблицы и использует "sqlerrd[2]" для получения серийного номера только что вставленных данных.
insert into email(serial_number, email_id) values(0, '[email protected]')
Из-за исчерпания серийного номера мы переходим на "bigserial". Однако приведенная выше логика получения серийного номера из "sqlerrd[2]" не работает, так как он имеет тип "integer".
Какое правильное решение для этого?
Примечание. В качестве обходного пути мы в настоящее время делаем вызов ifx_getbigserial
для получения серийного номера. Однако нас беспокоит наличие нескольких таблиц и одновременных транзакций, и мы не уверены, как работает этот API? В этом API не упоминается имя таблицы, и наше модульное тестирование показывает, что мы получаем правильные данные, но не уверены, правильное ли это решение.
Использование функции ifx_getbigserial()
правильно. Он возвращает информацию о последнем значении BIGSERIAL, сгенерированном для текущего сеанса. Другие сеансы не повлияют на это. Однако, если вы вставляете значения в несколько таблиц, каждая из которых имеет столбец BIGSERIAL, вы должны получить вставленное значение с помощью ifx_getbigserial()
после вставки в каждую таблицу и перед следующей вставкой либо в ту же таблицу, либо в любую другую таблицу со столбцом BIGSERIAL.
Это реальная функция — кавычки не нужны. Лично я бы использовал функцию, а не последовательность, но последовательность, безусловно, является альтернативой. Это не дорогая функция — она не требует обмена сообщениями с сервером и обратно; он просто извлекает некоторые данные, хранящиеся в информации о сеансе в клиентском коде.
Какая таблица системного каталога отслеживает максимальные серийные и большие серийные значения?
Информация хранится в управляющей информации таблицы, а не в системном каталоге. Последовательности разные; часть информации хранится в таблице системного каталога syssequences
.
Считаете ли вы, что использование объекта последовательности для генерации значения является лучшим решением, чем использование этой «функции»?