![]() |
Модераторы: Akella |
![]() ![]() ![]() |
|
Вася К. |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 9.2.2005 Репутация: нет Всего: нет |
Здраствуйте!
У меня есть несколько таблиц. В каждом есть поле ID и для него создан генератор номера SAME_TABLE_ID_GEN. Так же есть программа, из которой я получаю новое значение генератора с помощью хранимой процедуры: CREATE PROCEDURE SOME_TABLE_ID_GEN_PROC (PROC_RESULT INTEGER) AS BEGIN PROC_RESULT = GEN_ID (SOME_TABLE_ID_GEN, 1); END Конечно же, таким образом мне надо написть n-ое количество хранимых процедур для всех генераторов. Нельзя ли написать одну процедуру, в которой к генераторам я мог бы обратиться по имени, типа: CREATE PROCEDURE SOME_TABLE_ID_GEN_PROC (ID_GEN_NAME VARCHAR(255)) RETURNS (PROC_RESULT INTEGER) AS BEGIN PROC_RESULT = GEN_ID (ID_GEN_NAME, 1); END Interbase 6.5, FireBird 1.5.3. Спасибо! --------------------
Да здраствует ОПТИМИЗМ! |
|||
|
||||
Dimyan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 441 Регистрация: 12.1.2004 Где: Новосибирск Репутация: нет Всего: 4 |
c:\Program Files\Firebird\Firebird_1_5\doc\sql.extensions\README.execute_statement
почитай а вообще зачем такие сложности непонятно, ну если тебе так надо в преложнеии получить значения генератора то и вызови select GEN_ID (ID_GEN_NAME, 1) as id from rdb$database а вообще это в триггерах автоматом лепится
-------------------- Как хорошо ничего не делать, а потом еще немного отдохнуть :) |
|||
|
||||
Dubinsky |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 1.6.2005 Репутация: нет Всего: нет |
Dimyan, не очень правильно... Смотри:
рассмотрим твои тригера. положим что значение генератора 10. 1) Первая транзакция стартует, добавляет какое-то поле (Insert), срабатывает триггер, значение gen_id становитса 11, id добавленного итема тоже 11. 2) Вторая транзакция стартует, делает тоже самое, триггер уже 12. 3) Первая транзакция делает Select, как ты и говорил. Она получила значение 12, хота должна было получить значение 11. Вот и ошибка... |
|||
|
||||
TheCetus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 134 Регистрация: 9.3.2006 Репутация: нет Всего: 2 |
ничего подобного! Пока значение из Gen_Id не будет возвращено в первую транзакцию, вторая к нему доступа не получит.
Добавлено @ 15:30 в первую транзакцию будет возвращено значение 11 а во второю 12 |
|||
|
||||
Dubinsky |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 1.6.2005 Репутация: нет Всего: нет |
Сам на деле не проверял, но в описание Firebird (про Интербейс не уверен) я читал про ошибки подобного рода. И обходить как раз их надо с помощью процедуры. TheCetus, может ты не правельно понял. Итемы будут созданы правильно, т.е. их ID будут 11 и 12, но вот Select первой транзакции вернёт 12. Не проверял, спорить не будуу
![]() |
|||
|
||||
Linco |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 14.2.2006 Репутация: нет Всего: нет |
Генераторы работают вне контекста транзакций поэтому ИМХО 12
![]() |
|||
|
||||
TheCetus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 134 Регистрация: 9.3.2006 Репутация: нет Всего: 2 |
Понял о чем тред. на счет select gen_id(...) не могу точно сказать, возможно народ прав
![]() Вася К. , можно ведь использовать один генератор или несколько триггеров...имхо не проблема |
|||
|
||||
Dimyan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 441 Регистрация: 12.1.2004 Где: Новосибирск Репутация: нет Всего: 4 |
То что я показал применяется для автоматической инкременации. В чем проблема сделать для описанного тобой случая так: подпишись на сабытее бефор инсерт в компаненте который ты используешь для обновления и присваевай dataset.fieldbyname('id').asinteger результат запроса select gen_id(gen_name, 1) from rdb$database -------------------- Как хорошо ничего не делать, а потом еще немного отдохнуть :) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Interbase" | |
|
Обязательно указание: 1. Версию InterBase (Firebird, Yaffil) 2. Способа доступа (ADO, BDE, IBX и т.д.)
Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Firebird, Interbase | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |