在“IF”或附近发布Postgres语法错误

时间:2014-01-06 19:03:41

标签: sql postgresql if-statement

我是postgres的新手,我正在完成我的任务。我不得不创建一个只有1列的表,然后我被赋予了这个声明来运行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;

当我运行此操作时,我收到此错误:“IF”或其附近的语法错误

我已经看过这个38.6.2. Conditionals38.6.2. Conditionals了,我不太了解这个,我是否需要更改查询

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

然后当它结束时我应该结束:

END IF

为什么毕竟有错误?

2 个答案:

答案 0 :(得分:41)

IF和其他PL / pgSQL功能仅在PL / pgSQL函数中可用。如果要使用IF,则需要将代码包装在函数中。如果您使用的是9.0+,则可以使用DO编写内联函数:

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

如果您使用的是早期版本的PostgreSQL,那么您必须编写一个包含代码的命名函数,然后执行该函数。

答案 1 :(得分:1)

不是OP的答案,但可能是一些最终结果的答案(例如我自己): 如果在BEGIN-END块中声明变量,则将出现相同的语法错误。

所以这是错误的:

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

这应该解决它:

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