• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:orace 変更表エラーを回避するトリガー)

Oracleの変更表エラーを回避するトリガーの作成方法とは?

このQ&Aのポイント
  • Oracleの変更表エラーを回避するためには、複合トリガーを使用する必要があります。
  • 作成したトリガーは、挿入後に実行されます。
  • トリガーの中で新しい社員番号を生成し、それを社員テーブルに挿入するようになっています。

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

複合トリガーについては理解できていないのですが、質問の内容でも必要なのでしょうか。 >あるTBL1のフィールド:[氏名]を入力すると同テーブルのフィールド:[社員番号]が自動でセットされるようなトリガー だけなら、普通のトリガーでいいと思うのですが。 たとえば、 CREATE OR REPLACE TRIGGER TRG_SET_AUTO_SHAIN_NO BEFORE INSERT ON CM_PORTAL_SHAIN FOR EACH ROW WHEN (NEW.DATA_KBN in (2,3)) DECLARE GRP_CD VARCHAR2(3); SEQ_NO NUMBER(4); NEW_SET_NO VARCHAR2(7); BEGIN IF :NEW.DATA_KBN = 2 THEN GRP_CD := '999'; ELSE GRP_CD := '888'; END IF; --社員番号はグループごとに連番で振りたいということですよね? --質問文のコードでは連番取得後にテーブルの更新処理をしていないですが必要じゃないですか? --実際にはSEQUENCEを使った方がいいような気がします select SQ.GROUP_CD,SQ.SEQUENCE_NO + 1 into GRP_CD,SEQ_NO from CM_HAKEN_GROUP_SEQUENCE_MT SQ where SQ.GROUP_CD = GRP_CD for update; update CM_HAKEN_GROUP_SEQUENCE_MT set sequence_no = seq_no where GROUP_CD = GRP_CD; --SHAIN_NOに値を設定するだけで、トリガー内でINSERTやUPDATEを発行する必要はない --質問では、NEW_SET_NO := substr(GRP_CD,LPAD(SEQ_NO,4,0)); となっていましたが --本当は連結するのだろうと勝手に想像しました。 :new.SHAIN_NO := GRP_CD || LPAD(SEQ_NO,4,'0'); end; / こんな感じでも。

anman0201
質問者

お礼

ご回答ありがとうございます。 まさに言われてとおりです! というかソースをそのまま書いたらうまくいきました! シーケンスの更新部分も必要な箇所でしたので考慮頂き非常に助かりました。 こんなスマートな方法があったんですね。 大変勉強になりました。 本当にありがとうございます。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

今、検証する環境が手元にないのですが、 http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/appdev.111/E05670-03/triggers.htm#CIHIEFAE を見る限り ・複合トリガーにDECLARE宣言はない ・各トリガーのセクション(AFTER STATEMENT IS BEGIN で始まる)は「ND AFTER STATEMENT」で終わっている。 などが気になります。

anman0201
質問者

補足

ご回答ありがとうございます。 頂いたリンクから例文を参照しましたが、 FOR INSERTの部分で構文エラーが発生しているようです。 例文をそのまま実行してみてもFORの部分でエラーが発生します。 この部分はAFTER、BEFORE、INSTEAD OFを指定しなければいけないのでしょうか?

関連するQ&A