2016-06-21 14 views
3

Ist es möglich, auf den aktuellen Datensatz innerhalb einer Update-Anweisung zu verweisen/zuzugreifen/ihn zu übergeben?Zugriff auf den gesamten aktuellen Datensatz innerhalb der Update-Anweisung

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; 

Antwort

3

beziehen sich nur auf die Tabelle:

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

Uh, thanks man! – hooblei

+0

... oder innerhalb eines Schemas mit einem Alias ​​'UPDATE s1.t1 r SET foo = gen_t2_foo (_a, r) ​​...' – hooblei

1

Es sieht aus, dass die zweite Funktion wird erwartet, dass ein Wert aus dem Feld name in beiden Tabellen, und zwischen einem Start- und End-Indizes erstellen, nicht wahr? Stellen Sie in diesem Fall sicher, dass gen_t2_foo auch einen Index erhält, um die Werte eines einzelnen Datensatzes zusammenzuführen (in beiden Tabellen). Dann können Sie es verwenden, wie Sie es wollten.

Übrigens, warum deklarieren Sie upd_t2 als eine Funktion, die VOID zurückgibt? Dies wäre, was Verfahren angeboten werden für.

Verwandte Themen