Триггер запускающий процедуру при условии
Нужен триггер, запускающий процедуру при условии в Oracle. Если столбец doc в таблице docs не пустой, то должна срабатывать процедура v2020_2.
Структура таблицы
create table DOCS
(
DOC CLOB
)
Процедура
create or replace procedure v2020_2 is
. . .
end v2020_2;
Ответы (3 шт):
Автор решения: Aziz Umarov
→ Ссылка
примерно так
CREATE OR REPLACE TRIGGER TRIGGER_NAME
AFTER INSERT
ON docs
FOR EACH ROW
WHEN (NEW.doc IS NOT NULL)
BEGIN
EXECUTE v2020_2;
END;
или
CREATE OR REPLACE TRIGGER TRIGGER_NAME
AFTER INSERT
ON docs
FOR EACH ROW
BEGIN
IF :NEW.doc IS NOT NULL then
EXECUTE v2020_2;
END IF;
END;
Автор решения: 0xdb
→ Ссылка
Нужен ли триггер в этом случае. Если похожего обоснования нет в Reasons to Use Triggers, то причина очень часто - скрыть код от коллег, чтобы они его не сразу нашли.
Далее, следует учесть, что "пустой" и NULL (неопределён), это не одно и тоже.
Посмотрите, как всё красиво получается, приняв во внимание выше изложенное:
create table docs (
id int generated by default on null as identity,
name varchar2 (16), doc clob, len number, status varchar2 (12))
/
create or replace package docpack as
procedure new (name varchar2, doc clob := empty_clob ());
procedure process (id number, doc clob);
end;
/
create or replace package body docpack as
procedure new (name varchar2, doc clob := empty_clob ()) as
id number;
begin
insert into docs values (null, name, doc, length (doc), 'new')
returning id into id;
if doc != empty_clob () then process (id, doc); end if;
end;
procedure process (id number, doc clob) is
begin
/* do something */
update docs set status = 'processed'
where id = process.id;
end;
end;
/
И использовать не сложно:
exec -
docpack.new ('1st doc'); -
docpack.new ('2nd doc', 'abc 123');
select * from docs;
ID NAME DOC LEN STATUS
---------- ---------------- -------- ---------- ------------
1 1st doc 0 new
2 2nd doc abc 123 7 processed
Автор решения: wq55
→ Ссылка
Job решил мою задачу, причем использовал сразу две процедуры, одна за другой. Сначала выполняется первая процедура и следом вторая.
begin
sys.dbms_job.submit(job => :job,
what => 'begin
-- Call the procedure
v2020_22;
end;
begin
-- Call the procedure
v2020_2;
end;',
next_date => to_date('01-01-4000', 'dd-mm-yyyy'),
interval => '(sysdate)+2/1440');
commit;
end;