PostgreSQL"IF"语法错误

Str*_*rae 12 sql postgresql syntax if-statement

我是PostgreSQL的新手,我已经遇到了第一个问题..

我按照手动分步编写了一些代码来了解事务的工作原理.

为了简短起见,我创建了2个表,用户和移动:第一个是名称,电子邮件和信用列,第二个是from,to,import.

所以,我是这样尝试的:

BEGIN;
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
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我总是得到错误:

错误:"IF"处或附近的语法错误

我哪里弄错了?

PS:不要专注于示例功能,这只是我理解交易的试验......现在,IF条款......

pyr*_*lus 7

正如Johannes已经说过的那样:你正在将常规SQL与存储过程语言PL/pgSQL混合使用.Johannes提供的链接应该向您解释存储过程的概念.

我认为你是以剧本形式做的吗?一个接一个地执行一个声明?我担心您只能在存储过程或函数中执行您想要执行的操作,就像您可能称之为的那样.这是因为当您以这种方式执行语句时,每个语句都独立存在,没有关于其他语句的关系或信息.

此外,您可以查看以下链接,了解有关如何使用IF的更多信息...那么... ELSE ... END IF; plpgsql里面的条件:链接.


编辑:

我不知道此时是否允许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;
Run Code Online (Sandbox Code Playgroud)

但是,如果你真的走这条路,我建议使用GUI数据库管理器.学习这一切更容易.