2012-07-31 19 views
7

這是我的函數聲明和身體的一部分:PL/pgSQL的SELECT到數組

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; 

我想team_ids是整數,我就可以在UPDATE語句中使用的數組。這個功能給我的錯誤是這樣的:

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

我認爲你的訂單中的訂單錯誤。不應該這樣:'SELECT team_id INTO team_ids FROM tmp_team_list;' – 2012-07-31 07:26:28

回答

11

更快,更簡單了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; 

這且不說,同時用數組操作時,WHERE條款必須是

WHERE team_id = ANY (team_ids) 

IN結構可與套,而不是數組。

3

要從SELECT創建磁盤陣列:

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

IN運營商documented爲取一個子查詢的右側操作數。例如:

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

或許可以避開陣列完全,或嘗試提供的陣列或select from team_ids