
データベースはOracle10gです。
あるテーブルAにレコードが登録されたタイミングで、
別のテーブルBにレコードを登録するトリガを作成しようとしています。
トリガ内に全ての処理を記述するとかなりの行数になりそうなので、
登録のプロシージャを作成し、トリガからコールしようと考えています。
Aに登録されたレコードのカラムの一部を、Bに登録するレコードでも使用したいのですが、
プロシージャに引数として渡す際、
使用したいカラムを一つずつ指定しなければならないのでしょうか?
(使用したいカラムは10ほどあります。)
トリガに
「REFERENCING NEW ROW R1」と記述して、
このR1を渡すことはできないのでしょうか?
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>REFERENCING NEW ROW R1
という記述はできないと思います。
登録用プロシージャの引数はレコード型にしておいて、
トリガーでselect into でレコード型変数に値を格納して渡すようにしてはどうでしょうか。
トリガーではカラムを一つずつ列挙しないといけませんが、
プロシージャの引数はすっきり書けるようになります。
create or replace procedure test_proc(
a_rec table_a%rowtype --不要な項目が多ければ別途レコード型を作成しても
) is
begin
insert into table_b
values (a_rec.c1,a_rec.c2,…);
end;
/
create or replace trigger test_trig
after insert on table_a
for each row
declare
w_rec table_a%rowtype;
begin
select :new.c1,:new.c2,…
into w_rec
from dual;
test_proc(w_rec);
end;
/
あんまり変わらないですかね・・・
ご回答ありがとうございます。
とりあえず行数は気にせず、
プロシージャを呼び出さずにトリガ内だけで処理を行ってみたところ、
CREATE TRIGGER TRG_TEST
AFTER INSERT ON TBL_A
REFERENCING NEW ROW R1
FOR EACH NOW
BEGIN
INSERT INTO TBL_B (USER_ID, USER_NM, SYOZOKU_NM) VALUES (
R1.user_id,
R1.user_nm,
(SELECT syozoku_nm FROM TBL_SYOZOKU WHERE syozoku_cd = R1.syozoku_cd)
);
END
のような形で実行できました。(説明用に一部だけ抜粋しています)
省略した項目の中に、コードから名称を取得するような項目が他にも多数あったり、
コードの値によって分岐するような処理(IF文使用)があり、
処理が長くなってしまいそうなのでプロシージャを作ってコールしようとしています。
"プロシージャに引き渡す場合に「REFERENCING~」はダメ"という意味だったのでしょうか?
NO.1の方にご回答頂きましたが
引数10個ならそのまま記述することもアリなようですので
引数はそのまま記述してしまおうかと考えています。
レコード型を利用するなら不要な項目が多いので
オリジナルのレコード型を作成する方式になりそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
棒読みちゃんが起動できないの...
-
オラクル12C_SQLPlusで実行す...
-
ビットで表せる数値について
-
私は時々、アイホンを充電する...
-
子供向けプログラミングのスク...
-
sqlで質問です。 Aテーブルは店...
-
SQLの中上級者へのレベルアップ...
-
SELECTによる表の変換方法を教...
-
開発対象となるアプリケーショ...
-
質問です。 下記のテーブルとデ...
-
Oracleですがsqlで質問です。 ...
-
sqlで質問です。 Aテーブルの登...
-
sqlで質問です。 Aテーブルの情...
-
SQLの書き方について
-
SQLについて教えて下さい。 主...
-
sqlで質問です。 idを元にidに...
-
oracleで 10,20, 30, というデ...
-
索引作成について
-
googleプレイの履歴で取得とイ...
-
sql(oracle)で質問です。 テ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
group byの並び順を変えるだけ...
-
SELECT FOR UPDATE で該当レコ...
-
データ
-
【PL/SQL】FROM区に変数を使う方法
-
SQL*Loader Append
-
トランザクションログを出力せ...
-
AccessのSQL文で1件のみヒット...
-
where句中のtrim関数について
-
アクセスのレポートでレコード...
-
SQLで条件にヒットしたレコード...
-
updateで複数行更新したい
-
osqleditについて
-
引数によってwhere句を切り替え...
-
デフォルトでデータが表示され...
-
「数字で始まらない」ものを抽...
-
PL/SQL内の共通関数の引数にフ...
-
Oracleですがsqlで質問です。 ...
-
oracle DB内のデータを増幅す...
-
ACCESS レコードの並び順について
おすすめ情報