#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;