Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
22:04:2008, 11:00
|
|
Новенький ![]() Группа: Программист Сообщений: 7 Регистрация: 9:03:2008 Пользователь №: 15 736 Репутация: 0
|
я использую следующий триггрер:
SQL CREATE OR REPLACE TRIGGER PERSON_BIR BEFORE INSERT ON PERSON FOR EACH ROW BEGIN IF :new.ID IS NULL THEN SELECT PERSON_SEQ.nextval INTO :new.ID FROM dual; END IF; END PERSON_BIR; Что нужно писать для значения поля в столбце ID при создании записи в таблице PERSON? Если просто ничего не присваивать - то он ругается, что он не может присвоить null-значение. :-( |
|
Сообщение
#1
|
|
![]() |
|
|
23:04:2008, 07:37
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 25:12:2005 Пользователь №: 2 734 Специализация: программист Репутация: 0
|
Aleksandr06,
Весь код триггера такой: Код select GEN_PERSON_ID.NextVal into :New.ID from DUAL; Gen_PERSON_ID задаешь в SEQUENCE =) Цитата FOR EACH ROW тут глупо и бесполезно =) Потому что триггер срабатывает НА КАЖДУЮ запись(строчку) отдельно =) Сообщение отредактировал Shader88 - 23:04:2008, 07:39 |
|
Сообщение
#2
|
|
|
|
23:04:2008, 11:07
|
|
Почетный секретчик ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 166 Регистрация: 30:09:2003 Из: Брест Пользователь №: 58 Специализация: Пиво Репутация: 2
|
то он ругается он это кто? все должно отрабатывать. может ругаться клиент, который проверяет наличие значений для not null полей (т.к. он не знает о присвоении значения в триггере). через sqlplus строку вставить удается? тут глупо и бесполезно это необходимо! ID ведь надо назначить для каждой!!! строки. |
|
Сообщение
#3
|
|
|
|
23:04:2008, 12:29
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 25:12:2005 Пользователь №: 2 734 Специализация: программист Репутация: 0
|
Цитата ID ведь надо назначить для каждой!!! строки. ????, триггер срабатывает НА КАЖДУЮ СТРОЧКУ. Будете вставлять(Insert) 500 записей, триггер сработает 500 раз. =) Зачем огород городить?! |
|
Сообщение
#4
|
|
|
|
23:04:2008, 16:57
|
|
Почетный секретчик ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 166 Регистрация: 30:09:2003 Из: Брест Пользователь №: 58 Специализация: Пиво Репутация: 2
|
Shader88
буду вставлять 500 записей, с генерацией уникального первичного ключа. как это можно сделать не генерируя ключ для каждой записи? o_O |
|
Сообщение
#5
|
|
|
|
24:04:2008, 07:13
|
|
Новенький ![]() Группа: Программист Сообщений: 33 Регистрация: 25:12:2005 Пользователь №: 2 734 Специализация: программист Репутация: 0
|
????, я же написал.
Создаешь секвенс. Имя даешь Gen_Uniq_Key, задаешь ему необходимые параметры. В триггере забираешь новое значение из него(Gen_Uniq_Key.NextVal) и записываешь в поле уникального ключа записи(:New.Unique_Code_Of_Record). Вот так: Код select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; Если например секвенс был установлен так что первое значение будет 1, и инкремент 1, то на 500 записях будет работать: Добавление 1-ой записи: Код select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; -- теперь :New.Unique_Code_Of_Record = 1 2-ой записи Код select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; -- теперь :New.Unique_Code_Of_Record = 2 ... 500-ой Код select Gen_Uniq_Key.NextVal into :New.Unique_Code_Of_Record from DUAL; -- теперь :New.Unique_Code_Of_Record = 500 В итоге в таблице ключевое поле, тоже будет иметь значения 1..500 =) ????, я просто не могу понять где проблема? Сообщение отредактировал Shader88 - 24:04:2008, 07:15 |
|
Сообщение
#6
|
|
|
|
24:04:2008, 08:06
|
|
Почетный секретчик ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 166 Регистрация: 30:09:2003 Из: Брест Пользователь №: 58 Специализация: Пиво Репутация: 2
|
Не верю! (с)
ORA-04082: ссылки на NEW или OLD недопустимы в триггерах уровня таблицы ВОТ! как работают сиквенсы я знаю, тем более триггеры. а что-бы понять проблему, надо попробовать на практике создать statement триггер заполняющий ID из сиквенса, который при этом будет работать с BULK INSERT'ом, FORALL'ом не будет вызывать мутирование таблиц и т.д. З.Ы. row level триггер это делает сам без лишних движений |
|
Сообщение
#7
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 11:13 |