13

これが私の関数宣言と本体の一部です:

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で使用できるintの配列になりたいです。UPDATEこの関数は私に次のようなエラーを与えます:

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

3 に答える 3

14

ステートメントにFROM句をUPDATE含めると、より速く簡単になります。

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、配列ではなくセットで機能します。

于 2012-07-31T02:22:22.200 に答える
4

から配列を作成するにはSELECT

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

IN演算子は、右側のオペランドのサブクエリを取るものとして文書化されています。例えば:

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

おそらく、配列を完全に回避するか、配列またはを指定してみてくださいselect from team_ids

于 2012-07-31T00:57:01.770 に答える
0

他の答えに基づいた小さなカスタマイズ。が通常のintデータ型の
場合。team_id

   UPDATE team_prsnl p
    SET    updt_dt_tm = now()
          ,last_access_dt_tm = now()
    FROM   tmp_team_list t
    WHERE  p.team_id = any(array(select team_id from t));
于 2021-11-30T09:33:43.050 に答える