Oracleのトリガーについて

このQ&Aのポイント
  • Oracleのトリガーについて教えてください。
  • テーブルAにデータをINSERTする際に、特定の条件に合致した場合の変更方法について教えてください。
  • トリガーを使用して、日付が2月かつ営業所が00001の場合、または日付が2月かつ品名の後ろ5桁が00001の場合にフィールドを変更する方法を教えてください。
回答を見る
  • ベストアンサー

OracleのTrigger(トリガー)について

いつもご親切にありがとうございます。 Oracleのトリガーについて教えてください。 テーブルA ----------------- 日付 date型 品名 char(15) 営業所 cahr(5) フラグ char(1) データをINSERTする際に、下記のように変更したいです。 (1)日付が2月且つ、営業所が00001の場合は99999に変更、 (2)日付が2月且つ、品名の後ろ5桁が00001の場合後ろ5桁だけを99999に変更 下記のようにトリガーを作成しているんですけど、 (2)をどのように入れたらよいでしょうか? CREATE OR REPLACE TRIGGER TRG_テーブルA BEFORE INSERT ON テーブルA REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN IF ( to_char(:NEW.日付,'YYYYMM') = '201502' ) AND ( :NEW.営業所 = '00001' ) THEN :NEW.営業所 := '99999'; END IF; END; / よろしくお願いします。

  • Oracle
  • 回答数1
  • ありがとう数13

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

:NEW.営業所 := '99999';   <------- ココに elsif で式を追加すればよいのでは? END IF;

sakuraiy2
質問者

お礼

単純にその通りでした。 お手数をお掛けしました。 ありがとうございます。

関連するQ&A

  • PL/SQLのトリガー

    PL/SQLで書かれたトリガーをみていたら 次のようなスクリプトが出てきました。 REFERENCING OLD AS OLD NEW AS NEW OLDとは何をさしているのでしょうか。NEWに関しても同様です。 どなたかしっているかたはいらっしゃるでしょうか。 もしいらしたら教えてください。お願いします。

  • ORACLEのトリガーについて勉強しているのですが現在詰っています。

    ORACLEのトリガーについて勉強しているのですが現在詰っています。 トリガーの内容ですが、table1のレコードがUPDATEかINSERTかDELETEが 実行された時にtable2にそのレコードすべてをINSERTしたいのですが CREATE OR REPLACE TRIGGER test_trg After INSERT or UPDATE or DELETE on table1 for each row  BEGIN   if inserting then    insert into (?);   elsif updating then    insert into (?);   else    insert into (?);   end if;  END; tableを使ってログを残せるようにするためこのトリガーを作ろうとしています。 この様な感じになると思っているのですが、(?)の部分をどう書けばいいのか がよくわかりません。どうしても解らないので教えていただければ幸いです。 何卒よろしくお願いします。

  • プロシージャとトリガー

    Aというテーブルのaカラムが更新されれば、Bテーブルの列の中でAテーブルの列id含む列(複数)のbカラムをFalseからTrueに変更されるような、トリガー と プロシージャを作りたいのです。 考えていたのは、プロシージャは、 CREATE FUNCTION update_edit_b() RETURNS OPAQUE AS ' BEGIN (複数列指定?) NEW.b := 't'; RETURN NEW; END; ' LANGUAGE 'plpgsql'; プロシージャで、Bテーブルの複数列を指定するにはどうしたら良いでしょうか? トリガーは CREATE TRIGGER trgger_a AFTER UPDATE OF a ON Table_a FOR EACH STATEMENT EXECUTE PROCEDURE update_edit_b ; こんな感じでしょうか?

  • インサートトリガーについて

    Aテーブルのインサートトリガー(AFTER)の中でAテーブルの行数を取得することは可能でしょうか? 単純にトリガーの中でSELECT文を発行すると、「表JSC.Aテーブルは変更中の為、トリガー機能はこの表を読込み/修正することができ ません。」とエラーが出てしまいます。 回避策などはあるのでしょうか? オラクルのバージョンは8iです。 よろしくお願いします。

  • トリガーのエラー

    ORA-04098: トリガー'sss.ssss'が無効で妥当性再チェックに失敗しました。というようなエラーが出ます。 トリガー自体は下のような単純なものです。 このエラーは単純にトリガーの文法などのエラーでしょうか?それとも、ORACLE環境など他の原因なんでしょうか? よろしくお願いします。 ------------------------------------- CREATE or replace Trigger XInsert AFTER INSERT ON sTable FOR EACH ROW BEGIN INSERT INTO xxxxxx (s,a,b,c,d) values(seq_a.NEXTVAL ,:new.a ,:new.b ,:new.c ,:new.d ); END;

  • トリガーの起動条件で悩んでいます。

    超初心者です。 うまく説明できないかも知れませんが助けて下さい。 うまく動作しない処理は、 [A_TBL]が更新時に履歴あり・なしにそれぞれトリガーを用意しているのですが、 履歴なしの場合は[A_TBL]がUPDATEされるだけなので、 『[A_TBL]がUPDATEされたタイミングで[B_TBL]もUPDATEする』 という起動条件にしています。 履歴ありの場合は[A_TBL]のデータをUPDATEで無効化(FLGを立てます)し、 その後、更新データをINSERTで登録しようと思っています。 そのためトリガーの起動条件を、 『[A_TBL]がINSERTされたタイミングで[B_TBL]のデータをUPDATEする』 としていますが、 [A_TBL]に新規登録時のトリガーの起動条件が、 『[A_TBL]にINSERTされたタイミングで[B_TBL]にもINSERTする』 としているので、 [A_TBL]にINSERTされると両方のトリガーが起動してしまい、 怒られました。 自分の作ったトリガーを書いておくので どのようにしたらよいのか教えていただけませんでしょうか? トリガーの書き方におかしな点があったらご指摘もお願い致します。 よろしくお願いしますm(_ _)m 新規登録のトリガー CREATE OR REPLACE TRIGGER INS_01 AFTER INSERT ON A_TBL FOR EACH ROW BEGIN INSERT INTO B_TBL( ID, 姓, 名, 住所, 本籍, 電話番号, 郵便番号 )VALUES( :NEW.ID, :NEW.姓, :NEW.名, :NEW.住所, :NEW.本籍, :NEW.電話番号, :NEW.郵便番号 ); END; / 更新のトリガー CREATE OR REPLACE TRIGGER UP_01 AFTER INSERT ON A_TBL FOR EACH ROW BEGIN UPDATE B_TBL SET 姓 = :NEW.姓, 名 = :NEW.名, 住所 = :NEW.住所, 本籍 = :NEW.本籍, 電話番号 = :NEW.電話番号, 郵便番号 = :NEW.郵便番号 WHERE ID = :NEW.ID ; END; /

  • 続・トリガーの起動条件について質問です。

    先ほど書き込みしたものの回答が得られないので、 質問内容を少し変えます。 トリガーを作成する際に WHEN句に書き込める制限などはあるのでしょうか? 試しに CREATE OR REPLACE TRIGGER INS_01 AFTER INSERT ON A_TBL FOR EACH ROW WHEN(NEW.ID = (SELECT ・・・)) BEGIN ・・・・ END; / と書いたところ ORA-02251: ここでは副問合せは使用できません。 と怒られました。 また:NEWや:OLDの使えるはどの値を持ってくるのでしょうか? 自分はINSERT時には:NEWはVALUESの値、:OLDはNULL。 UPDATE時は:NEWはSETした値、:OLDはWHERE句で指定したレコードの値だと思っています。 間違いや補足ありましたら教えていただけると幸いです。 宜しくお願いします。

  • トリガーの設定方法

    いま、まったく同じ型のTABLE1,TABLE2の2つのテーブルがあり、 TABLE1にInsertやUpdateがかかると、自動的にTABLE2の方にも 同じようなInsertやUpdateが走る仕組みを作りたいと考えています。 TABLE1にトリガーを設定すれば可能ということは判ったのですが、 どのようにトリガーを記述すればわからず、困っています。 特に、「AS」以降の記述方法が判りません。 TABLE1にかかったクエリを同じようにTABLE2にもかかるように するにはどのように記述すればいいのでしょうか。

  • orace 変更表エラーを回避するトリガー

    お世話になります。 今回、あるTBL1のフィールド:[氏名]を入力すると同テーブルのフィールド:[社員番号]が自動で セットされるようなトリガーを作成しようとおもっています。 しかし、変更表の更新には複合トリガーを使用しなければ出来ないというのはわかったのですが、 うまいことコンパイルできません。下記に前提条件と自分なりに作成したトリガーをを記載しますので どなたか助けてください。 <前提条件> ・セットされる社員番号はプライマリーキーとなっている。 ・更新される条件はTBL1のフィールド:[データ区分]が2or3のとき <作成したトリガー> CREATE OR REPLACE TRIGGER TRG_SET_AUTO_SHAIN_NO FOR INSERT ON CM_PORTAL_SHAIN COMPOUND TRIGGER REFERENCING OLD AS OLD NEW AS NEW WHEN (NEW.DATA_KBN in (2,3)) DECLARE GRP_CD VARCHAR2(3); SEQ_NO NUMBER(4); NEW_SET_NO VARCHAR2(7); AFTER STATEMENT IS BEGIN IF :NEW.DATA_KBN = 2 THEN select SQ.GROUP_CD,SQ.SEQUENCE_NO + 1 into GRP_CD,SEQ_NO from CM_HAKEN_GROUP_SEQUENCE_MT SQ where SQ.GROUP_CD = '999'; ELSE select SQ.GROUP_CD,SQ.SEQUENCE_NO + 1 into GRP_CD,SEQ_NO from CM_HAKEN_GROUP_SEQUENCE_MT SQ where SQ.GROUP_CD = '888'; END IF; NEW_SET_NO := substr(GRP_CD,LPAD(SEQ_NO,4,0)); INSERT INTO CM_PORTAL_SHAIN (SHAIN_NO,SHIMEI_LOCAL,DATA_KBN) VALUES (NEW_SET_CD,:NEW.SHIMEI_LOCAL,:NEW.DATA_KBN); AFTER EACH ROW IS BEGIN INSERT INTO CM_PORTAL_SHAIN (SHAIN_NO) VALUES (NEW_SET_NO) END; / ちなみにこれでコンパイルするとエラーが発生します・・・ どこがいけないのでしょうか?

  • TRIGGERの書き方について

    MYSQLで株の履歴を作っています。 テーブルとしては、株を購入するユーザー書き込み用のa_nowstock、書き込み履歴を記録するa_nowstock_history、最新の保有株を記録するa_lateststockとなります。 テーブル a_nowstock    (a1_id(自動取得),a2_user_id,a3_usr_volume,a4_latest_volume) a_nowstock_history(b1_id(自動取得),b2_user_id,b3_usr_volume) a_lateststock (d1_id(自動取得),d2_user_id,d3_latest_volume) a_nowstock はユーザーが書き込むテーブル a_nowstock_historyは書き込み履歴 a_lateststockは最新保有情報のみのデータとなります。 これをTRIGGERで処理するために下記のようにSQLで指示してみました。 DELIMITER // CREATE TRIGGER a_ref BEFORE INSERT ON a_nowstock FOR EACH ROW BEGIN INSERT INTO a_nowstock_history SET b2_usr_id = NEW.a2_usr_id, b3_usr_volume = NEW.a3_usr_volume; UPDATE INTO a_lateststock SET d2_usr_id = NEW.a2_usr_id, d3_latest_volume = NEW.a4_latest_volume; END; // DELIMITER ; しかしながら #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near INTO a_lateststock SET d2_usr_id = NEW.a2_usr_id, d3_latest_volume = NEW.a4_latest_volume; ' at line 5 というエラーが出てしまいます。 DELIMITER // CREATE TRIGGER a_ref BEFORE INSERT ON a_nowstock FOR EACH ROW BEGIN INSERT INTO a_nowstock_history SET b2_usr_id = NEW.a2_usr_id, b3_usr_volume = NEW.a3_usr_volume; END; // DELIMITER ; のように、INSERT INTO だけだと問題なく作動するため、UPDATEがうまくいっていないようです。 TRIGGERはUPDATEも機能するはずなのですが、うまくいきません。 アドバイスいただけましたら幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL