Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Не работает триггер на выдачу уникального идентификатора  [new]
Train
Member

Откуда: Санкт-Петербург
Сообщений: 22
Доброго времени суток!
Нацарапал такой триггер
CREATE OR REPLACE TRIGGER TEST_TRIGGER
BEFORE INSERT UPDATE OF FIRM ON PERSONAL
FOR EACH ROW
WHEN (OLD.FIRM IS NOT NULL)
DECLARE
 MAX_TAB NUMBER(10);
 name_firm NUMBER(10);
BEGIN
SELECT firm.name INTO name_firm FROM firm WHERE firm.num=:NEW.FIRM;
IF (((:OLD.TAB = '') OR (:OLD.TAB IS NULL)) AND (TO_NUMBER(name_firm) > 499)) THEN
 BEGIN
  SELECT PERSONAL$_TAB_STRANGE.NEXTVAL INTO MAX_TAB FROM DUAL;
  :NEW.TAB := '0'||TO_CHAR(MAX_TAB);
 END;
END IF;
END;
который должен выдавать уникальный идентификатор, правда текстового вида, в зависимости от другого поля.
7 фев 07, 10:51    [3748387]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Sxak
Member

Откуда: Nsk
Сообщений: 516
Какие симптомы то? Он не компилитсчя, как-то сбоит или работает неправильно? Если неправильно то кк? На 1й взгляд видно что я например пишу .. before insert OR update но хз мб и так можно... ДУмаешь кому-то не льнь было бы всю структуру у себя создаватать? И гланвое не создаватьа угадывать ибо скриптов остальногонет
7 фев 07, 10:58    [3748444]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Sxak
Member

Откуда: Nsk
Сообщений: 516
Кстати мутаци не возникает при таком триггере? Где-то в ТОп популярных вопросов про мутации кажись написано
7 фев 07, 10:59    [3748454]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Шкураев Владимир
Member

Откуда:
Сообщений: 129
Поясните в чем проблема.
При вставке новой строки в таблицу он не сработает вот из за этого:WHEN (OLD.FIRM IS NOT NULL)
7 фев 07, 11:01    [3748479]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Train
Member

Откуда: Санкт-Петербург
Сообщений: 22
Компилируется нормально, при замене своего присутствия не обнаруживает, а при вставке нормально поле заполняет
7 фев 07, 11:09    [3748531]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
mcwhite
Member

Откуда: Москва
Сообщений: 423
Sxak
Кстати мутаци не возникает при таком триггере? Где-то в ТОп популярных вопросов про мутации кажись написано

Мутации в данном случае не при чём. В разделе операторов триггера, написанного автором топика, нет запросов к таблице, указанной в предложении ON.

Автору топика: вместо
WHEN (OLD.FIRM IS NOT NULL)
попробуйте
WHEN (:OLD.FIRM IS NOT NULL)
и, если будет время (и желание), сообщите о результатах.

Sxak'у: постить тексты с "падонкаффской" орфографией и грамматикой, равно как и обращаться ко всем на "ты" не есть признак хорошего тона. Модераторы Вам подскажут, отвечает ли принятая Вами манера поведения правилам форума и/или традициям общения на форуме. Или не подскажут...
7 фев 07, 11:13    [3748564]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Куча ошибок в тексте (читай Oracle9i Application Developer’s Guide - Fundamentals)

1. BEFORE INSERT OR UPDATE
2. модификатора OLD нет при INSERT
3. (((:OLD.TAB = '') OR (:OLD.TAB IS NULL)
это одно и то же. В Oracle пустая строка и NULL эквивалентны
7 фев 07, 11:17    [3748595]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
mcwhite
Sxak
Кстати мутаци не возникает при таком триггере? Где-то в ТОп популярных вопросов про мутации кажись написано

Мутации в данном случае не при чём. В разделе операторов триггера, написанного автором топика, нет запросов к таблице, указанной в предложении ON.

Автору топика: вместо
WHEN (OLD.FIRM IS NOT NULL)
попробуйте
WHEN (:OLD.FIRM IS NOT NULL)
и, если будет время (и желание), сообщите о результатах.

Sxak'у: постить тексты с "падонкаффской" орфографией и грамматикой, равно как и обращаться ко всем на "ты" не есть признак хорошего тона. Модераторы Вам подскажут, отвечает ли принятая Вами манера поведения правилам форума и/или традициям общения на форуме. Или не подскажут...


НЕ НАДО так пробовать!!!
7 фев 07, 11:18    [3748608]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
mcwhite
Member

Откуда: Москва
Сообщений: 423
tru55
НЕ НАДО так пробовать!!!

Sorry, конечно, не нужно. :(

tru55
1. BEFORE INSERT OR UPDATE
2. модификатора OLD нет при INSERT
3. (((:OLD.TAB = '') OR (:OLD.TAB IS NULL)
это одно и то же. В Oracle пустая строка и NULL эквивалентны

По первому пункту: автору уже отвечали до нас с Вами. По третьему пункту: это, строго говоря не синтаксическая ошибка, так что IMHO сойдёт и так... А вот утверждения, имеющего место быть в Вашем втором пункте, каюсь, не понял. Зачем модификатор OLD нужен перед ключемвым словом INSERT?
7 фев 07, 11:29    [3748688]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
OLD не нужен перед INSERT :)
Это было сказано к тому, что при выполнении INSERT на :OLD может идти ругань. Поэтому, если пишется триггер на несколько событий, как правило, ветки разделяются предикатами if INSERTING, if UPDATING
7 фев 07, 11:39    [3748770]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
mcwhite

...
По третьему пункту: это, строго говоря не синтаксическая ошибка, так что IMHO сойдёт и так...

Это ошибка в ДНК, видно, что автор что-то где-то слышал про null и трехзначную логику, теперь их боится
7 фев 07, 11:40    [3748781]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Sxak
Member

Откуда: Nsk
Сообщений: 516
tru55
Это было сказано к тому, что при выполнении INSERT на :OLD может идти ругань.
Ни разу не было... Такие триггеры вроде как у меня стоят.. и с :new на delete тоже. Алгоритм обратотки етого подразумевает что там мож быть нулл
7 фев 07, 11:44    [3748823]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
автор - учи матчась. Всё работает, как должно. Вот - для раздумий
declare
  a number := null;
begin
  dbms_output.put_line('hello');
  if a = '' then
    dbms_output.put_line('111');
  else
    dbms_output.put_line('А ты что ждал?');
  end if;
  dbms_output.put_line('by');
end;
/
hello
А ты что ждал?
by
7 фев 07, 11:47    [3748855]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
OraDen
Member

Откуда:
Сообщений: 828
tru55
Куча ошибок в тексте (читай Oracle9i Application Developer’s Guide - Fundamentals)

1. BEFORE INSERT OR UPDATE
2. модификатора OLD нет при INSERT
3. (((:OLD.TAB = '') OR (:OLD.TAB IS NULL)
это одно и то же. В Oracle пустая строка и NULL эквивалентны


По третьему пункту, мне почему то кажется что это не совсем одно и тоже,
и проверка по равенству null пускай и в виде '' не корректна по определению,
правильный и достаточный вариант :OLD.TAB IS NULL.
Кстати результат сравнения (значение = null) никогда не будет true,
даже если значение представляет собой null. Для лучшего понимания:

declare
 a varchar2(20) := '';
Begin
  if a = '' then
    dbms_output.put_line('true');
  else
    dbms_output.put_line('else');
  end if;
End;

declare
 a varchar2(20) := '';
Begin
  if a is null then
    dbms_output.put_line('true');
  else
    dbms_output.put_line('else');
  end if;
End;

А по поводу того что триггер не работает в update, возможно еще из за того что
при update не изменяется поле FIRM, триггер у вас работает только на изменение
одного столбца и если приводите код, то все таки лучше приводить рабочий :).

И tru55 совершенно прав при вставке :old не существует, пользуйтесь предикатами.
7 фев 07, 11:58    [3748939]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
OraDen
Member

Откуда:
Сообщений: 828
Ой меня опередили :)
7 фев 07, 12:01    [3748956]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
OraDen
Member

Откуда:
Сообщений: 828
То что у него в триггере написано даст true из за OR, вот для проверочки:
declare
 a varchar2(20) := '';
Begin
  if a = '' OR a is null then
    dbms_output.put_line('true');
  else
    dbms_output.put_line('else');
  end if;
End;

Но сравнение с null не корректно полюбому, для этого используются:
is null
is not null
7 фев 07, 12:06    [3749005]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Sxak
Member

Откуда: Nsk
Сообщений: 516
OraDen
То что у него в триггере написано даст true из за OR, вот для проверочки:

Эт ты кому пишешь? Кто-ньдь кроме может быть аффтара этогоне знает тут? А аффтар и написал or .. is null


OraDen
И tru55 совершенно прав при вставке :old не существует, пользуйтесь предикатами.
Нет не прав. Проверь и убедись сам
7 фев 07, 12:12    [3749051]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Sxak

OraDen
И tru55 совершенно прав при вставке :old не существует, пользуйтесь предикатами.
Нет не прав. Проверь и убедись сам


Согласен, не ругается. Он просто считает значение OLD = NULL
CREATE OR REPLACE TRIGGER INS_A1
BEFORE INSERT ON a1
FOR EACH ROW
BEGIN
  if :OLD.id > 10 then
    :NEW.id:= 99;
  elsif :OLD.id IS NULL then
    :NEW.id:= 0;
  else
    :NEW.id:= :NEW.id + 1;
  end if;  
END;

INSERT INTO a1(id) VALUES(15)

SELECT * FROM a1

id
---
0
7 фев 07, 12:21    [3749133]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
OraDen
Member

Откуда:
Сообщений: 828
Sxak
OraDen
То что у него в триггере написано даст true из за OR, вот для проверочки:

Эт ты кому пишешь? Кто-ньдь кроме может быть аффтара этогоне знает тут? А аффтар и написал or .. is null


OraDen
И tru55 совершенно прав при вставке :old не существует, пользуйтесь предикатами.
Нет не прав. Проверь и убедись сам


Извиняюсь, конечно пишу аффтару :)

По поводу :old в триггере на insert, если не изменяет память то раньше ругалась (в восьмерке),
хотя может и изменяет :), просто я стараюсь разделять обработку вставки и изменения
и не сталкиваюсь с такой ситуацией.
7 фев 07, 12:29    [3749199]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Sxak
Member

Откуда: Nsk
Сообщений: 516
OraDen
По поводу :old в триггере на insert, если не изменяет память то раньше ругалась (в восьмерке),
С 8кй не работал, но много работал с 7кой... (до 2004го) Вот только память уже измсеняет были ли такие триггеры у нас, Но все равно с тех пор помню, что ничего криминального в использовании :new на делете и :old на инсерт нет.. Просто надо учитывать что онни в таких случайх могуть быть налл
7 фев 07, 12:31    [3749225]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Train
Member

Откуда: Санкт-Петербург
Сообщений: 22
"OR" я потерял при вставке в форум вернул на место, вот он
CREATE OR REPLACE TRIGGER TEST_TRIGGER
BEFORE INSERT OR UPDATE OF FIRM ON PERSONAL
FOR EACH ROW
WHEN (OLD.FIRM IS NOT NULL)
DECLARE
 MAX_TAB NUMBER(10);
 name_firm NUMBER(10);
BEGIN
SELECT firm.name INTO name_firm FROM firm WHERE firm.num=:NEW.FIRM;
IF (((:OLD.TAB = '') OR (:OLD.TAB IS NULL)) AND (TO_NUMBER(name_firm) > 499)) THEN
 BEGIN
  SELECT PERSONAL$_TAB_STRANGE.NEXTVAL INTO MAX_TAB FROM DUAL;
  :NEW.TAB := '0'||TO_CHAR(MAX_TAB);
 END;
END IF;
END;
компилируется, Oracle 8.1.5, на old при инсерте не ругается
7 фев 07, 13:42    [3749852]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Train
Member

Откуда: Санкт-Петербург
Сообщений: 22
Шкураев Владимир
Поясните в чем проблема.
При вставке новой строки в таблицу он не сработает вот из за этого:WHEN (OLD.FIRM IS NOT NULL)

Действительно там стоит не old а new, поэтому insert работает
7 фев 07, 14:34    [3750311]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Elic
Member

Откуда:
Сообщений: 29990
Train
"OR" я потерял при вставке в форум вернул на место, вот он
Действительно там стоит не old а new, поэтому insert работает
Думаешь кому-то интересно разгадывать твои шарады?!! Похоже весь твой код - враньё. А ты крадёшь у участников время.
7 фев 07, 14:47    [3750408]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Train
Member

Откуда: Санкт-Петербург
Сообщений: 22
Спасибо всем за участие, проблема решена.
CREATE OR REPLACE TRIGGER TEST_TRIGGER
BEFORE INSERT OR UPDATE OF firm ON personal
FOR EACH ROW
WHEN (new.firm IS NOT NULL AND new.firm !=0)
DECLARE
 max_tab NUMBER(10);
 name_firm NUMBER(10);
BEGIN
 IF ((:old.tab IS NULL) OR (:old.tab BETWEEN ' ' AND '           '))THEN
  BEGIN
   SELECT firm.name INTO name_firm FROM assad.firm WHERE firm.num=:new.firm;
   IF (TO_NUMBER(name_firm) > 499) THEN
    SELECT personal$_tab_strange.nextval INTO max_tab FROM dual;
    :new.tab := '0'||TO_CHAR(max_tab);
   END IF;
  END;
 ELSE
  :new.tab := :old.tab;
 END IF;
END;
Проблема оказалось в том что система, в которую вставлялся триггер, в поле tab вместо пустого значения вставляла одинадцать пробелов (по размеру поля) :-О, а в обычных селектах, без обрамления, этого не было видно.
Извините если у кого зря отнял время.
15 фев 07, 17:33    [3792185]     Ответить | Цитировать Сообщить модератору
 Re: Не работает триггер на выдачу уникального идентификатора  [new]
Elic
Member

Откуда:
Сообщений: 29990
Train
 IF ((:old.tab IS NULL) OR (:old.tab BETWEEN ' ' AND '           '))THEN
Картинка с другого сайта. RTFM TRIM (FAQ)
15 фев 07, 17:46    [3792341]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить