Триггер запускающий процедуру при условии

Нужен триггер, запускающий процедуру при условии в 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; 
→ Ссылка