プロが教えるわが家の防犯対策術!

データベースはOracle10gです。

あるテーブルAにレコードが登録されたタイミングで、
別のテーブルBにレコードを登録するトリガを作成しようとしています。

トリガ内に全ての処理を記述するとかなりの行数になりそうなので、
登録のプロシージャを作成し、トリガからコールしようと考えています。

Aに登録されたレコードのカラムの一部を、Bに登録するレコードでも使用したいのですが、
プロシージャに引数として渡す際、
使用したいカラムを一つずつ指定しなければならないのでしょうか?
(使用したいカラムは10ほどあります。)
トリガに
「REFERENCING NEW ROW R1」と記述して、
このR1を渡すことはできないのでしょうか?

A 回答 (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;
/

あんまり変わらないですかね・・・
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

とりあえず行数は気にせず、
プロシージャを呼び出さずにトリガ内だけで処理を行ってみたところ、

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個ならそのまま記述することもアリなようですので
引数はそのまま記述してしまおうかと考えています。
レコード型を利用するなら不要な項目が多いので
オリジナルのレコード型を作成する方式になりそうです。

お礼日時:2010/12/25 09:11

項目10個くらいなら書けばいいでしょう。

desc テーブルAとかやってコピペで何とかなるでしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

一般的なプロシージャのコールの場合、引数に10個記述しても良いのかな?
ということで質問しました。
実際記述してみて動作させましたが問題なさそうですね。

お礼日時:2010/12/25 09:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す