Автор: Aleksandr06 22:04:2008, 11:00
я использую следующий триггрер:
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-значение. :-(
Автор: Shader88 23:04:2008, 07:37
Aleksandr06,
Весь код триггера такой:
Код
select GEN_PERSON_ID.NextVal into :New.ID from DUAL;
Gen_PERSON_ID задаешь в SEQUENCE =)
Цитата
FOR EACH ROW
тут глупо и бесполезно =) Потому что триггер срабатывает НА КАЖДУЮ запись(строчку) отдельно =)
Автор: ???? 23:04:2008, 11:07
Цитата(Aleksandr06 @ 22:04:2008 - 13:00)

то он ругается
он это кто? все должно отрабатывать. может ругаться клиент, который проверяет наличие значений для not null полей (т.к. он не знает о присвоении значения в триггере). через sqlplus строку вставить удается?
Цитата(Shader88 @ 23:04:2008 - 09:37)

тут глупо и бесполезно
это необходимо! ID ведь надо назначить для каждой!!! строки.
Автор: Shader88 23:04:2008, 12:29
Цитата
ID ведь надо назначить для каждой!!! строки.
????, триггер срабатывает НА КАЖДУЮ СТРОЧКУ.
Будете вставлять(Insert) 500 записей, триггер сработает 500 раз. =)
Зачем огород городить?!
Автор: ???? 23:04:2008, 16:57
Shader88
буду вставлять 500 записей, с генерацией уникального первичного ключа. как это можно сделать не генерируя ключ для каждой записи? o_O
Автор: Shader88 24:04:2008, 07:13
????, я же написал.
Создаешь секвенс. Имя даешь 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 =)
????, я просто не могу понять где проблема?

Или не знаете как работают триггеры и секвенсы?!