2012-07-31 7 views
7

Hier ist meine Funktion Erklärung und Teil des Körpers:PL/pgSQL SELECT in ein Array

CREATE OR REPLACE FUNCTION access_update() 
RETURNS void AS $$ 
DECLARE team_ids bigint[]; 
BEGIN 
    SELECT INTO team_ids "team_id" FROM "tmp_team_list"; 

    UPDATE "team_prsnl" 
    SET "updt_dt_tm" = NOW(), "last_access_dt_tm" = NOW() 
    WHERE "team_id" IN team_ids; 
END; $$ LANGUAGE plpgsql; 

I team_ids möge ein Array von ints sein, die ich dann in der UPDATE Anweisung verwenden kann. Diese Funktion gibt mir Fehler wie folgt aus:

psql:functions.sql:62: ERROR: syntax error at or near "team_ids" 
LINE 13: AND "team_id" IN team_ids; 
+0

Ich denke, Sie haben die Bestellung falsch in Ihrer Auswahl. Sollte das nicht sein: 'SELECT team_id INTO team_ids FROM tmp_team_list;' –

Antwort

11

Schneller und einfacher mit einem FROM clause in your UPDATE statement:

UPDATE team_prsnl p 
SET updt_dt_tm = now() 
     ,last_access_dt_tm = now() 
FROM tmp_team_list t 
WHERE p.team_id = t.team_id; 

das beiseite, während sie mit einem Array arbeitet, wird die WHERE Klausel

WHERE team_id = ANY (team_ids) 

Das IN Konstrukt arbeitet mit Sätzen sein müsste nicht mit Arrays.

3

Um ein Array aus einem SELECT zu erstellen:

# select array( select id from tmp_team_list) ; 
?column? 
---------- 
{1,2} 
(1 row) 

Der IN Operator ist documented als eine Unterabfrage für den rechten Operanden nehmen. Zum Beispiel:

UPDATE team_prsnl SET updt_dt_tm = NOW() 
WHERE team_id IN (SELECT id FROM tmp_team_list); 

Vielleicht können Sie das Array ganz vermeiden, oder versuchen, das Array oder select from team_ids liefern.