У меня есть ошибка с использованием триггера условного и обновления - PullRequest
0 голосов
/ 30 июня 2018

При выполнении этого триггера в ORACLE я получил следующую ошибку:

 Table, View Or Sequence reference 'OCEX_COMI.FECHA_ASIG_GT' not allowed in this context.

Это мой триггер:

create or replace trigger ocex_comi_total
before insert or update of id_gt,fecha_asig_gt on ocex_comi
for each row
begin
if ((ocex_comi.fecha_asig_gt > to_date('2018-12-15','yyyy-mm-dd')) and 
 (ocex_comi.fecha_asig_gt < to_date('2019-01-01','yyyy-mm-dd'))) 
then
update ocex_comi cm set
cm.PAGO_COM = (select uea.total_bono_especial from OCEX_UEA uea                   
                join OCEX_GUIA_TRANSITO gt on uea.id_uea = gt.dest_id
                where gt.cod_gt=cm.id_gt)
where cm.id_gt = (select gt.cod_gt from ocex_guia_transito gt JOIN 
                  ocex_uea uea on uea.id_uea=gt.dest_id 
                        where gt.cod_gt=cm.id_gt);
else
update ocex_comi cm set
cm.PAGO_COM = (select uea.total_x_pnp from OCEX_UEA uea                   
                join OCEX_GUIA_TRANSITO gt on uea.id_uea = gt.dest_id
                where gt.cod_gt=cm.id_gt)
where cm.id_gt = (select gt.cod_gt from ocex_guia_transito gt JOIN 
                  ocex_uea uea on uea.id_uea=gt.dest_id 
                        where gt.cod_gt=cm.id_gt);
end if;
end;

Что я пытался сделать, так это то, что с помощью этого триггера столбец "PAGO_COM" таблицы "ocex_comi" автоматически заполняется из таблицы "ocex_uea" благодаря столбцу "total_bono_special" (если в случае с датой поле «date_asig_gt» включено) с 15 декабря по 31 декабря) и, если нет, заполните столбец «total_x_pnp» (если дата поля «fecha_asig_gt» не находится между 15 декабря и 31 декабря). Некоторые Идея или помочь с ошибкой, которая приходит ко мне, спасибо.

1 Ответ

0 голосов
/ 30 июня 2018

Не обращайтесь непосредственно к столбцу таблицы; вам нужно сослаться на псевдокорд new :

if ((:new.fecha_asig_gt > to_date('2018-12-15','yyyy-mm-dd')) and 
 (:new.fecha_asig_gt < to_date('2019-01-01','yyyy-mm-dd'))) 
then

хотя я бы использовал литералы даты:

if :new.fecha_asig_gt > date '2018-12-15' and 
 :new.fecha_asig_gt < date '2019-01-01'
then

(Не уверен, если вы действительно хотите >=, а не >, хотя.)

Но вы также пытаетесь обновить все строки в таблице внутри каждой ветви вашей логики, что в любом случае не похоже на то, что вы действительно хотите сделать, и которое приведет к ошибке мутирующей таблицы во время выполнения, если вы попытаетесь.

Не совсем понятно, каково ваше намерение, но я думаю, что вы хотите что-то похожее на:

...
then
  select uea.total_bono_especial
  into :new.PAGO_COM
  from OCEX_UEA uea                   
  join OCEX_GUIA_TRANSITO gt on uea.id_uea = gt.dest_id
  where gt.cod_gt = :new.id_gt;
else
  ...

и подобные вещи в другой ветке.

Поскольку эти запросы очень похожи, вы можете заменить логику if / else одним запросом, whoch использует выражение case, чтобы решить, какое из двух значений столбца вернуть.

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