Postgres syntax error at or near "IF"

38,673

Solution 1

IF and other PL/pgSQL features are only available inside PL/pgSQL functions. You need to wrap your code in a function if you want to use IF. If you're using 9.0+ then you can do use DO to write an inline function:

do $$
begin
  -- code goes here
end
$$

If you're using an earlier version of PostgreSQL then you'll have to write a named function which contains your code and then execute that function.

Solution 2

Not the answer for the OP, but possibly the answer for some who end up here (like myself): If you DECLARE variables within the BEGIN-END block, you will get the same syntax error.

So this is wrong:

DO $$
BEGIN
  DECLARE my_var VARCHAR(50) := 'foo';
  IF some_var IS NULL THEN
     --some logic
  END IF;
END; 
$$ 

This should fix it:

DO $$
DECLARE my_var VARCHAR(50) := 'foo';
BEGIN
  IF some_var IS NULL THEN
     --some logic
  END IF;
END; 
$$ 
Share:
38,673
S. N
Author by

S. N

Updated on June 06, 2020

Comments

  • S. N
    S. N almost 4 years

    I am new to postgres and I am working on an assignment of mine. I had to create a table with only 1 column and, then I was given this statement to run in on pgadmin III:

    BEGIN;
    INSERT INTO mytable VALUES (1);
    SAVEPOINT savepoint1;
    INSERT INTO mytable VALUES (2);
    ROLLBACK TO SAVEPOINT savepoint1;
    INSERT INTO mytable VALUES (3);
    SAVEPOINT savepoint2;
    INSERT INTO mytable VALUES (4);
    INSERT INTO mytable VALUES (5);
    SAVEPOINT savepoint3;
    SELECT * FROM mytable;
    --NOTE: You need to run this IF statement as PGScript 
    --(button next to the normal run button)
    IF (CAST ((SELECT MAX(id) FROM mytable) AS INTEGER) = 4)
    BEGIN
          RELEASE SAVEPOINT savepoint2;
    END
    ELSE
    BEGIN
          INSERT INTO mytable VALUES(6);
    END
    --Run the next steps normally
    SAVEPOINT savepoint2;
    INSERT INTO mytable VALUES (7);
    RELEASE SAVEPOINT savepoint2;
    INSERT INTO mytable VALUES (8);
    ROLLBACK TO savepoint2;
    COMMIT;
    

    when I run this I get this error: syntax error at or near "IF"

    I have already take a look at this 38.6.2. Conditionals38.6.2. Conditionals , I dont understand this very well, Do I need to change the query to have

    IF (CAST ((SELECT MAX(id) FROM mytable) AS INTEGER) = 4) THEN 
    BEGiN 
    

    and then when it ends I should end it with:

    END IF
    

    Why there is an error after all??