
データベースは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で質問しましょう!
似たような質問が見つかりました
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- Excel(エクセル) Excel VBAについてです。 少しだけ知識はあるのですが、 うまくいかなかったので 質問させてい 3 2022/09/13 18:40
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコードの選択の仕方
-
GROUP BY 又は HAVING句?
-
MERGE文について
-
nullなどの不正なデータが存在...
-
2つの情報を1つのSQLで取...
-
ODBC SQL構文 VBA
-
小規模なデータベース
-
DISTINCTについて
-
oracle DB内のデータを増幅す...
-
負荷試験の後重くなります。。。
-
フラグがたっているデータがあ...
-
ユニークレコードの定義
-
【SQL】違うフィールド同士の集...
-
SELECT文の結果を変数に・・・
-
MySQLからフィールド名のリスト...
-
オープンオフィス
-
チェックボックスから得る値を...
-
UPDATE時にundefinedがセットさ...
-
付録CDなどの動画をWMPで...
-
時間の判定条件
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
group byの並び順を変えるだけ...
-
where句中のtrim関数について
-
【PL/SQL】FROM区に変数を使う方法
-
トランザクションログを出力せ...
-
SELECT FOR UPDATE で該当レコ...
-
引数によってwhere句を切り替え...
-
データ
-
SQL*Loader Append
-
AccessのSQL文で1件のみヒット...
-
updateで複数行更新したい
-
アクセスのレポートでレコード...
-
「数字で始まらない」ものを抽...
-
SQLで条件にヒットしたレコード...
-
デフォルトでデータが表示され...
-
osqleditについて
-
PL/SQL内の共通関数の引数にフ...
-
1レコード全てを改行なしで表...
-
トリガからプロシージャのコー...
-
BLOB型項目をSQLの検索条件に指...
おすすめ情報