Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> работа с триггером
Aleksandr06
Вставить ник
сообщение 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
 
Новая тема 
Ответов (1 - 6)
Shader88
Вставить ник
сообщение 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 +


Цитата(Aleksandr06 @ 22:04:2008 - 13:00) *
то он ругается

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

это необходимо! ID ведь надо назначить для каждой!!! строки.
Подняться вверх 
 
Сообщение #3
Shader88
Вставить ник
сообщение 23:04:2008, 12:29
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 33
Регистрация: 25:12:2005
Пользователь №: 2 734
Специализация: программист



Репутация: - 0 +


Цитата
ID ведь надо назначить для каждой!!! строки.

????, триггер срабатывает НА КАЖДУЮ СТРОЧКУ.
Будете вставлять(Insert) 500 записей, триггер сработает 500 раз. =)
Зачем огород городить?! wacko.gif
Подняться вверх 
 
Сообщение #4
????
Вставить ник
сообщение 23:04:2008, 16:57
Цитата Ответить 


Почетный секретчик
*****

Группа: Модеры
Сообщений: 1 166
Регистрация: 30:09:2003
Из: Брест
Пользователь №: 58
Специализация: Пиво



Репутация: - 2 +


Shader88
буду вставлять 500 записей, с генерацией уникального первичного ключа. как это можно сделать не генерируя ключ для каждой записи? o_O
Подняться вверх 
 
Сообщение #5
Shader88
Вставить ник
сообщение 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 =)

????, я просто не могу понять где проблема? wacko.gif Или не знаете как работают триггеры и секвенсы?! wacko.gif

Сообщение отредактировал Shader88 - 24:04:2008, 07:15
Подняться вверх 
 
Сообщение #6
????
Вставить ник
сообщение 24:04:2008, 08:06
Цитата Ответить 


Почетный секретчик
*****

Группа: Модеры
Сообщений: 1 166
Регистрация: 30:09:2003
Из: Брест
Пользователь №: 58
Специализация: Пиво



Репутация: - 2 +


Не верю! (с) smile.gif

ORA-04082: ссылки на NEW или OLD недопустимы в триггерах уровня таблицы

ВОТ! smile.gif

как работают сиквенсы я знаю, тем более триггеры. а что-бы понять проблему, надо попробовать на практике создать statement триггер заполняющий ID из сиквенса, который при этом будет работать с BULK INSERT'ом, FORALL'ом не будет вызывать мутирование таблиц и т.д. smile.gif

З.Ы. row level триггер это делает сам без лишних движений smile.gif
Подняться вверх 
 
Сообщение #7


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 17:05:2008 - 11:13
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net