Oracle PL/SQL – INSERT後のトリガーの例
この記事では、 `AFTER INSERT TRIGGER`の使い方を示します。挿入操作が実行された後に起動します。
1. INSERTトリガーの後
この例では、新しいユーザが
user
details`に作成され、
passportno`や
driving
license
no`のようなフィールドがない場合、
user
details`に ‘insert after’トリガーを介して新しいレコードが `user
reminders`に挿入されます
1.1テーブルとトリガーを作成します。
USER__DETAILS
CREATE TABLE USER__DETAILS ( USER__ID number(10) primary key, USER__NAME varchar2(15), EMAIL varchar2(20), PHONE number(12), PASSPORT__NO varchar2(10), DRIVING__LICENSE__NO varchar2(10) );
USER__REMINDERS
CREATE TABLE USER__REMINDERS ( USER__ID number(10), REMINDER__TEXT varchar2(200), REMINDER__DATE date, STATUS varchar2(10) );
trg
after
insert__user
CREATE OR REPLACE TRIGGER trg__after__insert__user AFTER INSERT on USER__DETAILS FOR EACH ROW DECLARE counter number(2); reminder__text varchar2(200); BEGIN counter := 0; reminder__text := ''; IF(:NEW.PASSPORT__NO = '' OR :NEW.PASSPORT__NO is null) THEN reminder__text := 'Please insert your passport details into system. '; counter := counter+1; END IF; IF(:NEW.DRIVING__LICENSE__NO = '' OR :NEW.DRIVING__LICENSE__NO is null) THEN reminder__text := reminder__text || 'Please insert your Driving license details into system.'; counter := counter+1; END IF; -- If passport__no and/or driving__license__no is missing -- then counter will be >0 and below code will insert into user__reminders table. IF(counter>0) THEN INSERT INTO USER__REMINDERS VALUES (:NEW.USER__ID,reminder__text,sysdate+3,'PENDING'); END IF; END;
1.2データを挿入してトリガーをテストします。
-- fire after insert trigger, no action. INSERT INTO USER__DETAILS VALUES(1、 'USERNM1'、 'abcdxyz @ abc.com'、9999999999、 'PASSNUM123'、 'DRIVLIC999'); -- fire after insert trigger, password is null, insert new record into USER__REMINDERS INSERT INTO USER__DETAILS VALUES (2,'USERNM22','[email protected]',1111111111,null,'LICNC12345'); -- fire after insert trigger, password and driving no are null, insert new record into USER__REMINDERS INSERT INTO USER__DETAILS VALUES(3、 'USERNM33'、 'xyztttt @ abc.com'、3333333333、null、null); -- fire after insert trigger, driving no is null, insert new record into USER__REMINDERS INSERT INTO USER__DETAILS VALUES (4,'USERNM44','[email protected]',4444444444,'ONLYPASS11',null);
1.3データを表示します。
select ** from USER__DETAILS;
| =========================================== ================ | USER
ID | USER
NAME | EMAIL | PHONE | PASSPORT
NO | DRIVING
LICENSE__NO | 1 | USERNM1 |
[email protected]
| 9999999999 | PASSNUM123 | DRIVLIC999 | 2 | USERNM22 | xyzabcd @ abc.com | 1111111111 | null | LICNC12345 | 3 | USERNM33 |
[email protected]
| 3333333333 |ヌル|ヌル| 4 | USERNM44 |
[email protected]
| 4444444444 | ONLYPASS11 | null | ======= ========================================== ========
select ** from USER__REMINDERS;
| =========================================== ======================== | USER
ID | REMINDER
TEXT | REMINDER__DATE | STATUS | 2 |パスポートの詳細をシステムに挿入してください。 | 21-JUN-2017 |保留中
| 3 |パスポートの詳細をシステムに挿入してください。運転免許の詳細をシステムに挿入してください。 | 21-JUN-2017 |保留中
| 4 |運転免許の詳細をシステムに挿入してください。 | 21-JUN-2017 |保留中| ================================= ==================
参考文献
-
https://docs.oracle.com/cd/B19306
01/server.102/b14200/statements
7004.htm#i2153487[Creating
DMLトリガー:例]。
https://docs/
トリガ: – Oracleの公式ドキュメント]。リンク://oracle/oracle-plsql-before-insert-trigger-example/[Oracle
PL/SQL – INSERT前のトリガの例]