重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

トリガを実行したときに、処理部分のfunctionで更新されたデータの値を取得したいと考えております。

NEW変数を使い、
NEW.[フィールド名]とすれば取得できるのは知っているのですが、
この[フィールド名]にfunction内で取得した項目名を指定するにはどうしたら良いのでしょうか?

仮に取得したいフィールド名が「sample_id」だった場合、
functionの中でNEW.sample_idとすれば取得できます。

が、今回考えていたのは以下のような処理の場合です。
記述イメージなので間違っているかもしれませんが、、、

begin
for rec in SELECT att.attname
        FROM pg_attribute as att
        INNER JOIN pg_class as class ON class.oid = att.attrelid
        WHERE att.attnum > 0
        AND class.relname='テーブル名'
        ORDER BY att.attnum
 loop
 insert into 'テーブル名2' values(NEW.rec.attname);
loop end
end;

ループでテーブル内の項目を取得し、取得した項目の値をテーブル名に入れるという処理です。

rec.attnameには「sample_id」と入っていたので、NEW.rec.sample_idとしたのですが、
実行したときにエラーになり、どうしてもinsertできません。
どうにかして、sample_idの値をinsertしたいのですがわかりません。

ご教授お願い致します。

A 回答 (2件)

NEWに対して動くか試していないので分かりませんけれど


動的にテーブルやカラム名を指定するときは
SQL文を文字列の結合||で作って、EXECUTEします。

こんな感じではないでしょうか。
EXECUTE 'INSERT INTO "テーブル名2" VALUES(NEW.' || rec.attname ')';

動いたら是非教えてください(^^)

参考URL:http://www.postgresql.jp/document/current/html/p …
    • good
    • 0
この回答へのお礼

なるほどー。
明日になりますが、ためしてみます!
ありがとうございます。
結果わかったら教えます!

お礼日時:2011/05/29 19:51

トリガー内でNEWとかOLDが使えるのは、トリガーの元表やViewの項目に対してですけど。

    • good
    • 0
この回答へのお礼

そうなんですね。
全然無知ですみません。
回答有難うございます。

お礼日時:2011/05/29 19:50

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