Запуск Oracle при выполнении определенного условия

#oracle11g #oracle-sqldeveloper

#оракул11g #oracle-sqldeveloper #oracle11g

Вопрос:

Мое требование заключается в том, чтобы у меня была таблица, в которой есть 4 столбца (val1, val1_date, new_val1, new_val1_date).

Проблема в том, что когда new_val1 обновляется вместе с new_val1_date , мне нужно соответствующим образом обновить столбцы val1,val1_date.

Для этого я создал функцию.

Теперь, когда new_val1_date равно sysdate, я хочу выполнить триггер. Мой триггер не дает мне надлежащего результата.

Кто-нибудь может мне в этом помочь.

 create or replace TRIGGER MY_Trigger
     AFTER INSERT  OR UPDATE ON my_table 
FOR EACH ROW
WHEN (TO_DATE(NEW.new_val1_date,'dd/mon/yyyy')<=TO_DATE(sysdate,'dd/mon/yyyy'))
declare
    V_CD_ERROR NUMBER; 
    V_DS_ERROR VARCHAR2(500);

begin
    My_UpdateProc(V_CD_ERROR,V_DS_ERROR);
    DBMS_OUTPUT.PUT_LINE('V_CD_ERROR: ' || V_CD_ERROR || ' V_DS_ERROR ' || V_DS_ERROR);
end;
  

Комментарии:

1. Какие ошибки / результаты вы получаете? Что у вас есть внутри функции?

Ответ №1:

В столбцах даты Oracle хранится временная метка, поэтому, если ваше вставленное значение не совпадает с sysdate с точностью до секунды, ожидаемого результата не будет.

Вам нужно «обрезать» даты, чтобы временная метка была установлена на полночь для обоих значений. Затем он будет вычисляться на основе даты.

Кроме того, оценка должна выполняться внутри начального / конечного блока триггера.

 create or replace TRIGGER MY_Trigger
     AFTER INSERT  OR UPDATE ON my_table 
FOR EACH ROW
declare
    V_CD_ERROR NUMBER; 
    V_DS_ERROR VARCHAR2(500);

begin
  if (trunc(NEW.new_val1_date) = trunc(sysdate)) then
    My_UpdateProc(V_CD_ERROR,V_DS_ERROR);
    DBMS_OUTPUT.PUT_LINE('V_CD_ERROR: ' || V_CD_ERROR || ' V_DS_ERROR ' || V_DS_ERROR);
  end if;
end;