Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Gen_id 
V
    Опции темы
Вася К.
Дата 11.3.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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.

Спасибо!
--------------------
Да здраствует ОПТИМИЗМ!
PM MAIL YIM   Вверх
Dimyan
Дата 13.3.2006, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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


а вообще это в триггерах автоматом лепится
Код

CREATE TRIGGER имя_тригера_BI FOR _таблица_
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
      NEW.ID = GEN_ID(GEN_имя_генератора_ID,1);
END




--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
Dubinsky
Дата 23.3.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



Dimyan, не очень правильно... Смотри:

рассмотрим твои тригера. положим что значение генератора 10.

1) Первая транзакция стартует, добавляет какое-то поле (Insert), срабатывает триггер, значение gen_id становитса 11, id добавленного итема тоже 11.
2) Вторая транзакция стартует, делает тоже самое, триггер уже 12.
3) Первая транзакция делает Select, как ты и говорил. Она получила значение 12, хота должна было получить значение 11. Вот и ошибка...
PM MAIL WWW   Вверх
TheCetus
Дата 23.3.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: нет
Всего: 2



ничего подобного! Пока значение из Gen_Id не будет возвращено в первую транзакцию, вторая к нему доступа не получит.
Добавлено @ 15:30
в первую транзакцию будет возвращено значение 11 а во второю 12

PM MAIL   Вверх
Dubinsky
Дата 23.3.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



Сам на деле не проверял, но в описание Firebird (про Интербейс не уверен) я читал про ошибки подобного рода. И обходить как раз их надо с помощью процедуры. TheCetus, может ты не правельно понял. Итемы будут созданы правильно, т.е. их ID будут 11 и 12, но вот Select первой транзакции вернёт 12. Не проверял, спорить не будуу smile
PM MAIL WWW   Вверх
Linco
Дата 23.3.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.2.2006

Репутация: нет
Всего: нет



Генераторы работают вне контекста транзакций поэтому ИМХО 12 smile Что касается процедуры смотри в сторону execute statement в firebird.
PM MAIL   Вверх
TheCetus
Дата 24.3.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: нет
Всего: 2



Понял о чем тред. на счет select gen_id(...) не могу точно сказать, возможно народ прав smile
Вася К. , можно ведь использовать один генератор или несколько триггеров...имхо не проблема
PM MAIL   Вверх
Dimyan
Дата 27.3.2006, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 441
Регистрация: 12.1.2004
Где: Новосибирск

Репутация: нет
Всего: 4



Цитата(Dubinsky @ 23.3.2006, 18:41)
Dimyan, не очень правильно... Смотри:

рассмотрим твои тригера. положим что значение генератора 10.

1) Первая транзакция стартует, добавляет какое-то поле (Insert), срабатывает триггер, значение gen_id становитса 11, id добавленного итема тоже 11.
2) Вторая транзакция стартует, делает тоже самое, триггер уже 12.
3) Первая транзакция делает Select, как ты и говорил. Она получила значение 12, хота должна было получить значение 11. Вот и ошибка...

То что я показал применяется для автоматической инкременации. В чем проблема сделать для описанного тобой случая так: подпишись на сабытее бефор инсерт в компаненте который ты используешь для обновления и присваевай
dataset.fieldbyname('id').asinteger
результат запроса select gen_id(gen_name, 1) from rdb$database


--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1160 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.