0

每次我尝试执行如下所示的 DO 语句时,Greenplum 数据库(一个 PostgreSQL 分支)都会引发错误。具体来说,错误:“DO”处或附近的语法错误。为什么是这样?我正在运行基于 PostgreSQL 8.2.15 的 Greenplum(版本?)。

DO LANGUAGE plpgsql $$
        BEGIN
            IF (SELECT COUNT(*) FROM test) > 1 THEN
                CREATE TABLE test2 AS SELECT * FROM test
            END IF;
        END;
$$;

请注意,如果我将它作为一个函数执行它可以正常工作。

CREATE OR REPLACE FUNCTION test_maker ()
RETURNS void AS
$_$
BEGIN
            IF (SELECT COUNT(*) FROM test) > 1 THEN
                    CREATE TABLE test2 AS SELECT * FROM test;
            END IF;
END $_$ LANGUAGE plpgsql;

SELECT test_maker();
4

1 回答 1

1

更新:您根本没有使用 PostgreSQL。您正在使用 Greenplum 数据库。它是一种基于旧 PostgreSQL 的大量修改版本的数据库产品。它不是 PostgreSQL。这有点像在使用 Drizzle 或 Percona 时说“我正在使用 MySQL”,但更不同。如果您使用 Greenplum,请这样说,不要只将其称为“PostgreSQL”。

如果您使用的是 Greenplum 数据库,我的升级建议毫无意义,因为您实际上并没有像您说的那样使用 PostgreSQL 8.2.15,您使用的是一些声称在协议级别是 Pg 8.2.15 的 Greenplum 数据库版本(我觉得非常令人沮丧)。


为什么是这样?我正在运行 PostgreSQL 8.2.15

使用不那么史前的 PostgreSQL 版本。正如 Milen 所指出的,DO块是在 9.0 中添加的。

一般来说,每当您发现 PostgreSQL 中的 SQL 解析器无法识别的内容、无法识别的函数等时,您在运行旧版本时的第一个想法应该是“我会检查手册对于 8.2,看看它是否存在”。

无论如何,你真的,真的,真的需要升级。立即升级到 8.2.23;你错过了一些严重的修复。然后开始计划升级到 8.4 或更高版本,最好直接升级到 9.3。您必须处理由以下原因引起的应用程序兼容性问题:

  • 在 8.3 中删除对文本的隐式强制转换
  • bytea_output默认更改(如果您使用 bytea,请更新您的客户端驱动程序,或更改设置)
  • standard_conforming_strings默认更改(再次,如果您需要临时可以将其更改回来)
  • 删除对隐式连接的向后兼容支持
于 2014-02-26T23:19:38.427 回答