Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Ошибка при создании триггера  [new]
ded-mazay
Member

Откуда:
Сообщений: 260
Доброго времени!
пишу триггер на вставку записей в 2 таблицы при вставке в одну:
CREATE OR REPLACE TRIGGER InsertOusourceWare
AFTER INSERT ON WaresList
FOR EACH ROW
BEGIN
	if(:new.WL_E_ID IS NULL) then
		update WaresList set WL_E_ID = 1 where WL_ID = :new.WL_ID;
	end if;
	select count(*) into or_gty from OutsourceReceipts where OR_F_ID = decode((select c_name from categories, subcategories where c2_c_id = c_id and c2_id = :new.WL_C2_ID), 'MONITOR', 159, 'AUDIO', 159, 'TV', 159, 'WHITE', 159, 'VCR', 159, 'M.TOOLS', 159, 'OFAPL', 159, 158) and OR_Date is null
	if or_gty = 0 then
		select or_id_seq.nextval into new_or_id from dual;
		insert into OutsourceReceipts (OR_ID, OR_E_ID, OR_F_ID) values (new_or_id, 1, decode((select c_name from categories, subcategories where c2_c_id = c_id and c2_id = :new.WL_C2_ID), 'MONITOR', 159, 'AUDIO', 159, 'TV', 159, 'WHITE', 159, 'VCR', 159, 'M.TOOLS', 159, 'OFAPL', 159, 158));
		insert into OutsourceWares (OW_WL_ID, OW_F_ID, OW_OR_ID_OUT, OW_U_ID, OW_INFO) values (:new.WL_ID, decode((select c_name from categories, subcategories where c2_c_id = c_id and c2_id = :new.WL_C2_ID), 'MONITOR', 159, 'AUDIO', 159, 'TV', 159, 'WHITE', 159, 'VCR', 159, 'M.TOOLS', 159, 'OFAPL', 159, 158), new_or_id, 1, :new.WL_Info);
	else
		select or_id into my_or_id from OutsourceReceipts where OR_F_ID = decode((select c_name from categories, subcategories where c2_c_id = c_id and c2_id = :new.WL_C2_ID), 'MONITOR', 159, 'AUDIO', 159, 'TV', 159, 'WHITE', 159, 'VCR', 159, 'M.TOOLS', 159, 'OFAPL', 159, 158) and OR_Date is null and rownum < 2
		insert into OutsourceWares (OW_WL_ID, OW_F_ID, OW_OR_ID_OUT, OW_U_ID, OW_INFO) values (:new.WL_ID, decode((select c_name from categories, subcategories where c2_c_id = c_id and c2_id = :new.WL_C2_ID), 'MONITOR', 159, 'AUDIO', 159, 'TV', 159, 'WHITE', 159, 'VCR', 159, 'M.TOOLS', 159, 'OFAPL', 159, 158), my_or_id, 1, :new.WL_Info);
	end if;
END;
/

получаю Warning: Trigger created with compilation errors.
с синтаксисом все верно?
20 дек 11, 13:04    [11795571]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
ded-mazay
получаю Warning: Trigger created with compilation errors.
с синтаксисом все верно?

Для начала неплохо бы посмотреть в all_errors
20 дек 11, 13:10    [11795617]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
ded-mazay
Member

Откуда:
Сообщений: 260
говорит identifier 'OR_GTY' must be declared
а как в триггере его задать?
в ф-ции так:
IS
or_gty number;

в триггире так не получается..
20 дек 11, 13:26    [11795848]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
ded-mazay
говорит identifier 'OR_GTY' must be declared
а как в триггере его задать?
в ф-ции так:
IS
or_gty number;

в триггире так не получается..

А доку почитать?
DECLARE
or_gty number;
BEGIN
20 дек 11, 13:30    [11795889]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
ded-mazay
Member

Откуда:
Сообщений: 260
Сделал теперь
PLS-00103: Encountered the symbol "FOR" when expecting one of the following: begin function package pragma procedure subtype type use form current cursor
20 дек 11, 13:30    [11795897]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Дык смотря куда ты DECLARE воткнул :)

Доку под названием Application Developer’s Guide—Fundamentals сильно лень открыть?
20 дек 11, 13:34    [11795938]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 940
ded-mazay
Доброго времени!
пишу триггер на вставку записей в 2 таблицы при вставке в одну:
CREATE OR REPLACE TRIGGER InsertOusourceWare
AFTER INSERT ON WaresList
FOR EACH ROW
BEGIN
if(:new.WL_E_ID IS NULL) then
update WaresList set WL_E_ID = 1 where WL_ID = :new.WL_ID;
end if;

получаю Warning: Trigger created with compilation errors.
с синтаксисом все верно?


Imho - бред, ведущий к ORA-04091

Best regards

Maxim
20 дек 11, 13:37    [11795984]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
ded-mazay
Member

Откуда:
Сообщений: 260
Maxim Demenko, не, в этом месте все нормально, так и надо.
Всем спасибо, все получилось!
не все переменные сначала обозначил..
20 дек 11, 14:25    [11796582]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
ded-mazay
не, в этом месте все нормально, так и надо.

Верный способ борьбы с мутированием таблиц: все нормально, так и надо
20 дек 11, 14:33    [11796678]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
ded-mazay
Maxim Demenko, не, в этом месте все нормально, так и надо.
Всем спасибо, все получилось!
не все переменные сначала обозначил..

Если какая-то программа скомпилировалась, это не значит, что она будет работать [ правильно ]
20 дек 11, 14:37    [11796729]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
Stax..
Guest
ded-mazay
Доброго времени!
с синтаксисом все верно?

по синтаксису
CREATE OR REPLACE TRIGGER InsertOusourceWare
AFTER INSERT ON t
FOR EACH ROW
DECLARE
  OR_GTY number (10);
BEGIN
  if or_gty = 0 then
    null;
  end if;
END;
/

терерь насчет
if(:new.WL_E_ID IS NULL) then
update WaresList set WL_E_ID = 1 where WL_ID = :new.WL_ID;
end if;

в BEFORE INSERT
if(:new.WL_E_ID IS NULL) then
:new.WL_E_ID:=1;
end if;


насчет
select count(*) into or_gty from OutsourceReceipts where OR_F_ID =
в многопользовательской системе Вы должны понимать что не увидете "не закомиченные" записи

ps
select or_id_seq.nextval into new_or_id from dual;
в не древних версиях
new_or_id:=or_id_seq.nextval;

.....
stax
20 дек 11, 16:45    [11798232]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Stax..,

имхо, правильно Maxim Demenko , про бред..
и про технику отдельных деталей тут подсказывать - только усугублять тотальную печаль
20 дек 11, 17:06    [11798446]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
stax..
Guest
orawish
Stax..,

имхо, правильно Maxim Demenko , про бред..
и про технику отдельных деталей тут подсказывать - только усугублять тотальную печаль

мож ето первый триггер у ДедаМазая
имхо написать просто бред, мало, поетому я немножко уточнил

помню свой (похожий) бред
надо было сгенерить несколько ид, решил соптимизировать вместо
select s.nextval into new_id1 from dual;
select s.nextval into new_id2 from dual;

улучшил
select s.nextval,s.nextval into new_id1,new_id2 from dual;

счас период празников (св Миколая), мож ДедМазай под ето и закодировал триггерок

ps
лично мне был бы более удобен одинаковый синтаксис для триггеров и хранимок (IS/BEGIN)

.....
stax

.....
stax
20 дек 11, 18:11    [11799028]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
ded-mazay,

CREATE OR REPLACE TRIGGER InsertOusourceWare
AFTER INSERT ON WaresList
FOR EACH ROW
DECLARE
c_or_f_id OutsourceReceipts.OR_F_ID%TYPE;
my_or_id  OutsourceReceipts.or_id%TYPE;
BEGIN
  
  if(:new.WL_E_ID IS NULL) then
    :NEW.WL_E_ID = 1;
  end if;
  
  select decode(c_name, 'MONITOR', 159, 'AUDIO', 159, 'TV', 159, 'WHITE', 159, 
                        'VCR', 159, 'M.TOOLS', 159, 'OFAPL', 159, 158) 
    INTO c_or_f_id                     
    from categories, subcategories 
   where c2_c_id = c_id 
     and c2_id = :new.WL_C2_ID;
  
  select min(or_id)
    into my_or_id 
    from OutsourceReceipts 
   where OR_F_ID = c_or_f_id  
     and OR_Date is NULL;
     
  if my_or_id IS NULL then
    
    insert into OutsourceReceipts (OR_ID, OR_E_ID, OR_F_ID) 
    values (or_id_seq.nextval, 1, c_or_f_id)
    RETURNING OR_ID INTO my_or_id;
    
    insert into OutsourceWares (OW_WL_ID, OW_F_ID, OW_OR_ID_OUT, OW_U_ID, OW_INFO) 
    values (:new.WL_ID, c_or_f_id, my_or_id, 1, :new.WL_Info);
  
  else
    insert into OutsourceWares (OW_WL_ID, OW_F_ID, OW_OR_ID_OUT, OW_U_ID, OW_INFO) 
    values (:new.WL_ID, c_or_f_id, my_or_id, 1, :new.WL_Info);
  end if;
  
END;
20 дек 11, 18:15    [11799050]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании триггера  [new]
stax..
Guest
SysOper
ded-mazay,

CREATE OR REPLACE TRIGGER InsertOusourceWare
AFTER 
INSERT ON WaresList
FOR EACH ROW
DECLARE
c_or_f_id OutsourceReceipts.OR_F_ID%TYPE;
my_or_id  OutsourceReceipts.or_id%TYPE;
BEGIN
  
  if(:new.WL_E_ID IS NULL) then
    :NEW.WL_E_ID = 1;
  end if;
  
  select decode(c_name, 'MONITOR', 159, 'AUDIO', 159, 'TV', 159, 'WHITE', 159, 
                        'VCR', 159, 'M.TOOLS', 159, 'OFAPL', 159, 158) 
    INTO c_or_f_id                     
    from categories, subcategories 
   where c2_c_id = c_id 
     and c2_id = :new.WL_C2_ID;
  
  select min(or_id)
    into my_or_id 
    from OutsourceReceipts 
   where OR_F_ID = c_or_f_id  
     and OR_Date is NULL;
     
  if my_or_id IS NULL then
    
    insert into OutsourceReceipts (OR_ID, OR_E_ID, OR_F_ID) 
    values (or_id_seq.nextval, 1, c_or_f_id)
    RETURNING OR_ID INTO my_or_id;
    
    insert into OutsourceWares (OW_WL_ID, OW_F_ID, OW_OR_ID_OUT, OW_U_ID, OW_INFO) 
    values (:new.WL_ID, c_or_f_id, my_or_id, 1, :new.WL_Info);
  
  else
    insert into OutsourceWares (OW_WL_ID, OW_F_ID, OW_OR_ID_OUT, OW_U_ID, OW_INFO) 
    values (:new.WL_ID, c_or_f_id, my_or_id, 1, :new.WL_Info);
  end if;
  
END;
20 дек 11, 18:42    [11799224]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить