我是博士后的新手,正在做我的一项任务.我必须创建一个只有一列的表,然后我得到了一个在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

到底为什么会有错误??

推荐答案

IF和其他PL/pgSQL功能仅在PL/pgSQL函数中可用.如果你想使用IF,你需要把你的代码包装成一个函数.如果您使用的是9.0+,那么您可以使用DO来编写一个内联函数:

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

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

Postgresql相关问答推荐

如何在PSQL中查询jsonb列包含字符串的嵌套数组

哪种数据类型是除法的结果?

多克.波斯格雷斯.PgAdmin4

从数据集中提取彼此喜欢的用户(&Q;)

EF Core和npgsql连接池已被耗尽

postgresql中多个左连接的空结果

heroku、postgreSQL、django、comments、tastepie:没有运算符匹配给定的名称和参数类型

Rails 迁移:PostgreSQL 上的 Bigint 似乎失败了?

PostgreSQL ,从 2 个表中 Select ,但仅从表 2 中 Select 最新的元素

postgresql 在查询中插入空值

在 PL/pgSQL 中声明行类型变量

如何在psql中退出查询结果查看器?

PostgreSQL:使用 psql 命令行实用程序时 Windows 上的编码问题

如何为 postgres 连接设置 application_name?

SQL:多次重复结果行,并对行进行编号

由于外键约束无法删除对象

如何使 array_agg() 像 mySQL 中的 group_concat() 一样工作

使用 Postgresql 数据库(OSX Lion)创建 Rails 3.1 应用程序

使用 Postgres 在 Rust 的 Diesel 库中添加时间戳

调用 getNextException 来查看原因:如何让 Hibernate / JPA 显示异常的数据库服务器消息