2016-06-21 3 views
3

更新ステートメント内の現在のレコードを参照/アクセス/渡すことはできますか?更新ステートメント内の現在のレコード全体にアクセスする方法

CREATE TABLE t1 (
    id serial PRIMARY KEY, 
    name text 
); 

CREATE TABLE t2 (
    id serial PRIMARY KEY, 
    name text, 
    foo text 
); 

CREATE FUNCTION gen_t2_foo(_a t1, _b t2) RETURNS text AS $$ 
    SELECT _a.name || ' - ' || _b.name; 
$$ LANGUAGE sql; 

CREATE FUNCTION upd_t2(_min_id int, _max_id int, _a t1) RETURNS VOID AS $$ 
    UPDATE t2 SET 
    foo = gen_f2_name(_a, ???) -- How to pass the current t2 record? 
    WHERE id >= _min_id AND id <= _max_id; 
$$ LANGUAGE sql; 

答えて

3

だけの表を参照してください。

create function upd_t2(_min_id int, _max_id int, _a t1) 
returns void as $$ 
    update t2 
    set foo = gen_t2_foo (_a, t2) 
    where id >= _min_id and id <= _max_id; 
$$ language sql; 
+0

ええと、感謝の男! – hooblei

+0

...または別名 'UPDATE s1.t1 r SET foo = gen_t2_foo(_a、r)...'を使用するスキーマ内では、 – hooblei

1

それは右、第二の機能は、両方のテーブルにフィールドnameから価値を創出することが期待されていることを見て、開始と終了のインデックス間の?その場合、gen_t2_fooも(両方のテーブルの)単一のレコードの値をマージするためのインデックスを受け取るようにしてください。それから、あなたが望むように使用することができます。

ところで、なぜあなたはVOIDを返す関数としてupd_t2を宣言していますか?これは手順のために提供されるでしょう。

関連する問題