sql - PostgreSQL "IF"语法错误

标签 sql postgresql syntax if-statement

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

我写了一些代码来理解交易是如何工作的,一步一步地遵循手册。

简而言之,我创建了 2 个表,user 和 movements:第一个表中有 name、email 和 credit 列,第二个表中有 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;

我总是得到错误:

ERROR: syntax error at or near "IF"

我哪里错了?

P.S.:不要关注示例功能,这只是我理解交易的尝试......现在,IF 子句......

最佳答案

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

我认为你是在用脚本来做这件事?一个接一个地执行一个语句?恐怕你只能在存储过程或函数中做你想做的事,你可能会这样调用它。这是因为当您以这种方式执行语句时,每个语句都独立存在,与其他语句没有任何关系或信息。

此外,您可以查看以下链接以获取有关如何使用 IF ... THEN ... ELSE ... END IF 的更多信息; plpgsql 中的条件:link .


编辑:

我不知道此时是否允许回滚(因为每个存储过程已经在其自己的事务中),但您必须能够使用广泛的文档@ 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 数据库管理器。学习这一切更容易。

关于sql - PostgreSQL "IF"语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/802764/

相关文章:

sql - 如何在 Tarantool 中从 SQL 调用 C 函数?

sql - 设置Microsoft.Practices.EnterpriseLibrary的默认隔离级别

sql - 如何阻止 Postgres 将记录创建详细信息输出到终端(rails c/dev 模式)? 100 0's of "放慢了我的程序

c++ - C/C++ 语法 - 使用 , 而不是 ; 分隔语句合法的?

function - 在语言层面, `ccall` 到底是什么?

MySQL,从一张表中加入两行并忽略双胞胎

SQL 递归表无限循环

linux - 在 PostgreSQL 函数中使用参数运行系统命令

postgresql - 在 docker-compose 中的容器入口点之后运行脚本

json - Azure 逻辑应用对 SQL 行的 HTTP 响应正文