お世話になります。
今回、ある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 SQL文のエラー(ORA-0092...
-
sqlで質問です。 Aテーブルは店...
-
SQLの中上級者へのレベルアップ...
-
SELECTによる表の変換方法を教...
-
開発対象となるアプリケーショ...
-
質問です。 下記のテーブルとデ...
-
Oracleですがsqlで質問です。 ...
-
sqlで質問です。 Aテーブルの登...
-
sqlで質問です。 Aテーブルの情...
-
SQLの書き方について
-
SQLについて教えて下さい。 主...
-
sqlで質問です。 idを元にidに...
-
oracleで 10,20, 30, というデ...
-
索引作成について
-
googleプレイの履歴で取得とイ...
-
sql(oracle)で質問です。 テ...
-
オラクルゴールドについて
-
sqlのupdate文で質問です。 テ...
-
ビットで表せる数値について
-
TOPページ以外の、301リダイレ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
orace 変更表エラーを回避する...
-
年月が連続したテーブルとそう...
-
PL/SQL 条件アップデートについて
-
SELECT文で条件にあったテーブ...
-
こういうDELETE文を作成したい...
-
ORACLEで2つのテーブルを同時に...
-
Oracle SQL 2つのテーブルを使...
-
SQLの作成について
-
同じフィールドから2種類の値を...
-
★アクセス2000★条件付き合計金...
-
SQLを考えてます。
-
こういうSELECTは可能でしょうか?
-
FOREIGN KEYの書き方
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
Accessで別テーブルの値をフォ...
-
SELECTで1件のみ取得するには?
-
SQL文で右から1文字だけ削除す...
-
ADO VBA 実行時エラー3021
-
ファイル書込みで一行もしくは...
おすすめ情報