sql >> Databáze >  >> RDS >> Oracle

log spouště věštce

Toto může být jeden z těch vzácných případů, kdy můžete použít pragma autonomous_transaction . Umožní vám to zavázat se, aniž by to ovlivnilo vaši hlavní transakci. Používejte jej opatrně. Zjistěte více o autonomních transakcích a pragma autonomních_transakcí

Zde je příklad:

   -- our error logging table 

   create table tb_log(
      msg varchar2(123)
    )
    /

   -- our working table
   create table tb_table(
     col11 number
    )
    /

-- procedure that is going to log errors


[email protected]> create or replace procedure log_error(p_msg in varchar2)
  2    is
  3      pragma autonomous_transaction;
  4    begin
  5      insert into tb_log(msg)
  6        values(p_msg);
  7      commit;
  8    end;
[email protected]> /

Procedure created.

[email protected]> create or replace trigger tr_tb_table
  2    before insert on tb_table
  3    for each row
  4    begin
  5      if mod(:new.col1, 2) != 0
  6      then
  7         log_error('Error!');
  8         raise_application_error(-20000, 'Error has ocurred!');
  9      end if;
 10    end;
 11  /

Trigger created.

[email protected]> select * from tb_log;

no rows selected

[email protected]> select * from tb_table;

no rows selected

[email protected]> insert into tb_table(col1) values(1);

insert into tb_table(col1) values(1)
            *
ERROR at line 1:
ORA-20000: Error has ocurred!
ORA-06512: at "NK.TR_TB_TABLE", line 5
ORA-04088: error during execution of trigger 'NK.TR_TB_TABLE'


[email protected]> select * from tb_log;

MSG
--------------------------------------------------------------------------------
Error!


  1. Lokální proměnné MySQL

  2. Jak používat cizí klíč při dotazování ze dvou tabulek

  3. Zlepšení výkonu prostorového MySQL dotazu

  4. PostgreSQL 11:Recenzenti záplat pro rozdělování záplat