2014-01-06 60 views
13

我是postgres的新手,我正在處理我的任務。我不得不創建一個表,只有1列和,然後我得到了此語句的pgAdmin III運行:Postgres語法錯誤在「IF」處或附近

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 

爲什麼所有的錯誤都是?

+0

您錯過了'THEN' ...這是'如果...然後...其他...'。你有'如果...... ELSE'。 –

+0

@MarcB我試了一下,但仍然收到錯誤 –

回答

31

IF和其他PL/pgSQL功能僅在PL/pgSQL功能中可用。如果您想使用IF,則需要將代碼包裝在函數中。如果你使用9.0或更高版本,那麼你可以做使用DO寫一個內聯函數:如果你正在使用PostgreSQL的早期版本,那麼你就必須寫一個名爲函數包含代碼

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

然後執行該功能。

+2

在這個特殊情況下它不起作用,但值得一提的是['CASE'](http://www.postgresql.org/docs/9.4/static /functions-conditional.html)的行爲類似於「IF」,並且可以在PL/pgSQL函數之外使用。 - 在這些情況下需要考慮的事情。 – Travis

相關問題