14

Here's my function declaration and part of the body:

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 want team_ids to be an array of ints that I can then use in the UPDATE statement. This function give me errors like this:

psql:functions.sql:62: ERROR:  syntax error at or near "team_ids"
LINE 13:  AND "team_id" IN team_ids;
1
  • I think you got the order wrong in your select. Shouldn't that be: SELECT team_id INTO team_ids FROM tmp_team_list; Commented Jul 31, 2012 at 7:26

3 Answers 3

14

Faster and simpler with a 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;

That aside, while operating with an array, the WHERE clause would have to be:

WHERE p.team_id = ANY (team_ids)

The IN construct works with lists or sets, not with arrays. See:

Sign up to request clarification or add additional context in comments.

Comments

5

To create an array from a SELECT:

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

The IN operator is documented as taking a subquery for the right-hand operand. For example:

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

Perhaps you can avoid the array altogether, or try supplying the array or select from team_ids.

Comments

0

a tiny customization based on other answers.
If the team_id is a normal int data type.

   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));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.