PLSQL構文7-トリガベース
トリガのタイプ:
トリガーイベント:
トリガがトリガーされるイベント(INSERT、UPDATE、DELETE文によるテーブルまたはビューのデータ処理操作など)、DDL文(CREATE、ALTER、DROP文によるデータベースの作成、変更、削除など)、データベース・システム・イベント(システムの起動または終了、例外エラーなど)、ユーザー・イベント(データベースへのログインまたは終了など).
トリガ条件:
トリガ条件は、WHERE句によって指定される論理式です.トリガは、式の値がtrueの場合にのみ、トリガイベントに遭遇して自動的に実行され、トリガ操作が行われます.そうしないと、トリガイベントに遭遇してもトリガは実行されません.
トリガーオブジェクト:
フリップフロップが実行するPL/SQLプログラム、すなわち実行部.
トリガタイミング:
トリガタイミングトリガのトリガ時間を指定します.BEFOREとして指定されている場合は、DML操作を実行する前に、いくつかのエラー操作が発生したり、いくつかのビジネス・ルールが実装されたりすることを防止するためにトリガーされることを示します.AFTERとして指定されている場合は、DML操作の後にトリガされ、その操作または何らかの事後処理が記録されることを示す.
条件述語:
トリガに複数のトリガ・イベント(INSERT、UPDATE、DELETE)の組合せが含まれている場合、それぞれ異なるイベントに対して異なる処理を行うために、Oracleで提供される次の条件述語を使用する必要があります.
INSERTING:トリガイベントがINSERTの場合はTRUE、そうでない場合はFALSEとする.
UPDATING[(column_1,column_2…column_n)]:トリガイベントがUPDATEの場合、column_を変更した場合x列の場合はtrue、そうでない場合はfalse、column_xはオプションです.
DELETING:トリガイベントがDELETEの場合はTRUE、そうでない場合はFALSEとなります.
トリガサブタイプ:
トリガサブタイプは行トリガ(row)と文トリガ(statement)に分けられ、行トリガは各行の操作に対してトリガされ、文トリガはこの操作に対して1回のみ実行され、一般的にsql文操作を実行する場合は行トリガであり、テーブル全体に対してセキュリティチェック(すなわち不正操作の防止)を行う場合にのみ文トリガされます.これを省略すると、デフォルトでは行がトリガーされます.
また、トリガには、トリガされたローの古い値と新しい値に対応する2つの相関値があり、oldとnewで表されます.
トリガーの作成:
/*CREATE [OR REPLACE] TRIGGER < >
*/
例1:
--
-- 1: ,
create or replace trigger t_back_grade
after delete
on grade
referencing new as new old as old --
for each row
declare
r_grade grade%rowtype;
begin
--
r_grade.id := :old.id;
r_grade.name :=:old.name;
-- ...
-- commit;
end t_back_grade;
:
CREATE OR REPLACE TRIGGER "BIZBENIFITRATELOG_TR"
BEFORE INSERT OR UPDATE OR DELETE ON BIZBENIFITRATELOG
referencing new as new old as old
FOR EACH ROW
declare
i number(10);
ii number(10);
opttype CHAR(1);
dataid varchar2(32);
parentid varchar2(32);
icount number(10);
iflag number(1);
state varchar2(2);
begin
iflag := 0;
icount := 0;
if inserting then
if :new.id is null then
select BIZBENIFITRATELOG_S.nextval into :new.id from dual;
else
select BIZBENIFITRATELOG_S.nextval into ii from dual;
select BIZBENIFITRATELOG_S.currval into ii from dual;
while (:new.id > ii) loop
select BIZBENIFITRATELOG_S.nextval into ii from dual;
end loop;
end if;
end if;
parentid := :new.ALLOTID;
if inserting then
opttype := 'A';
dataid := :new.ID;
elsif updating then
select count(1)
into icount
from msgsend
where BIZTABLE = 'Bizbenifitratelog'
and BIZID = :new.ID
and BIZSTATE in ('0', '3');
if icount > 0 then
iflag := 1;
else
opttype := 'M';
dataid := :new.ID;
parentid := :old.ALLOTID;
end if;
else
opttype := 'D';
dataid := :old.ID;
parentid := :old.ALLOTID;
end if;
if iflag = 0 then
select msgsend_s.nextval into i from dual;
if opttype = 'D' then
state := '5';
else
state := '0';
end if;
insert into msgsend
(ID,
BIZTYPE,
BIZID,
PARENTID,
BIZTABLE,
OPERATETYPE,
BIZSTATE,
BIZDATE,
NUM)
values
(i,
'Bizallot',
dataid,
parentid,
'Bizbenifitratelog',
opttype,
state,
to_char(sysdate, 'YYYY-MM-DD'),
0);
end if;
end BIZBENIFITRATELOG_TR;