お世話になります。
今回、ある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;
/
ちなみにこれでコンパイルするとエラーが発生します・・・
どこがいけないのでしょうか?
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;
/
こんな感じでも。
ご回答ありがとうございます。
まさに言われてとおりです!
というかソースをそのまま書いたらうまくいきました!
シーケンスの更新部分も必要な箇所でしたので考慮頂き非常に助かりました。
こんなスマートな方法があったんですね。
大変勉強になりました。
本当にありがとうございます。
No.1
- 回答日時:
今、検証する環境が手元にないのですが、
http://otndnld.oracle.co.jp/document/products/or …
を見る限り
・複合トリガーにDECLARE宣言はない
・各トリガーのセクション(AFTER STATEMENT IS BEGIN で始まる)は「ND AFTER STATEMENT」で終わっている。
などが気になります。
この回答への補足
ご回答ありがとうございます。
頂いたリンクから例文を参照しましたが、
FOR INSERTの部分で構文エラーが発生しているようです。
例文をそのまま実行してみてもFORの部分でエラーが発生します。
この部分はAFTER、BEFORE、INSTEAD OFを指定しなければいけないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Oracle SQL update方法 2 2022/06/22 14:07
- Excel(エクセル) vba シート名の一覧を2列に分けるには 5 2023/04/24 08:56
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) Sheet2の日付をキーにオートフィルターで2023年1月のデータを抽出し、Sheet3へ書き出すた 2 2023/03/06 23:57
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
orace 変更表エラーを回避する...
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
SQL文で右から1文字だけ削除す...
-
GROUP BYを使ったSELECT文の総...
-
Accessで別テーブルの値をフォ...
-
SELECTで1件のみ取得するには?
-
実績累計の求め方と意味を教え...
-
MERGE文を単体テーブルに対して...
-
DataGridViewの、選択されてい...
-
MySQLで MAX()とGROUP BYを使う...
-
select句副問い合わせ 値の個...
-
ファイル書込みで一行もしくは...
-
チェックボックスの項目をDBにi...
-
アクセスで「空き番」の確認
-
Access でレコードセレクタが押...
-
SQLの集計で「全て」の合計も表...
-
SET句内で複数の条件を指定して...
-
カウント結果を1レコードの中...
-
【初歩】ラジオボタンをつかっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessに2つのテーブルを結合...
-
Oracle SQL 2つのテーブルを使...
-
orace 変更表エラーを回避する...
-
こういうDELETE文を作成したい...
-
こういうSELECTは可能でしょうか?
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
-
SQL文で右から1文字だけ削除す...
-
GROUP BYを使ったSELECT文の総...
-
select句副問い合わせ 値の個...
-
レコードが存在しなかった場合
-
ADO VBA 実行時エラー3021
-
SQL文で素早くNULLを除外する方法
-
実績累計の求め方と意味を教え...
-
ファイル書込みで一行もしくは...
-
select insertで複数テーブルか...
-
キーが同じを複数行を1行にま...
-
SELECTの結果で同一行を複数回...
おすすめ情報