Как уже сказал Йоханнес: вы смешиваете обычный SQL с PL / pgSQL, языком хранимых процедур. Ссылка, которую предоставляет Йоханнес, должна объяснить вам концепцию хранимых процедур.
Я так понимаю, вы делаете это как сценарий? Выполнение одного заявления за другим? Боюсь, что вы можете делать только то, что вы хотите делать внутри хранимой процедуры или функции, как вы могли бы это назвать. Это связано с тем, что когда вы выполняете операторы таким образом, каждое утверждение само по себе не имеет никакой связи или информации относительно других операторов.
Кроме того, вы можете посмотреть следующую ссылку для получения дополнительной информации о том, как использовать IF ... THEN ... ELSE ... END IF; условия внутри plpgsql: ссылка .
EDIT:
Я не знаю, разрешен ли ROLLBACK в этот момент (поскольку каждая хранимая процедура уже находится в отдельной транзакции), но вы должны быть в состоянии выяснить это самостоятельно, используя обширную документацию @ http://www.postgresql.org. Вот пример функции с вашим кодом, также демонстрирующий некоторый другой синтаксис:
CREATE OR REPLACE FUNCTION public.test()
RETURNS integer AS
$$
DECLARE
tempvar integer;
BEGIN
tempvar := 1;
INSERT INTO movements (from, to, import) VALUES ('mary', 'steve', 600);
UPDATE users SET credit = credit - 600 WHERE name = 'mary';
UPDATE users SET credit = credit + 600 WHERE name = 'steve';
--here comes the problem!
IF (SELECT credit FROM users WHERE name = 'mary') < 0 THEN
ROLLBACK;
END IF;
RETURN tempvar;
END
$$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;
Однако, если вы действительно идете по этому пути, я рекомендую использовать менеджер БД GUI. Все это легче усвоить.