无法在Greenplum中使用DO执行匿名代码块

时间:2014-02-26 15:46:31

标签: postgresql plpgsql greenplum

Greenplum数据库(PostgreSQL fork)每次尝试执行如下所示的DO语句时都会抛出错误。具体来说,ERROR:“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();

1 个答案:

答案 0 :(得分: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所指出的那样,9.0中添加了DO块。

一般情况下,每当你发现PostgreSQL中的SQL解析器无法识别的东西,无法识别的函数等,你在运行古老版本时首先想到的应该是“我会检查8.2的手册并查看它是否存在“。

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

  • 在8.3
  • 中删除隐式强制转换为文本
  • bytea_output默认更改(如果您使用bytea更新您的客户端驱动程序,或更改设置)
  • standard_conforming_strings默认更改(如果您需要暂时更改,可以将其更改回来)
  • 删除隐式联接的后向compat支持