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

Posted

技术标签:

【中文标题】无法在 Greenplum 中使用 DO 执行匿名代码块【英文标题】:Cannot execute an anonymous code block with DO in Greenplum 【发布时间】:2014-02-26 15:46:31 【问题描述】:

每次我尝试执行如下所示的 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();

【问题讨论】:

匿名代码块首先出现在v9.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 所说,DO 块是在 9.0 中添加的。

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

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

在 8.3 中删除了对文本的隐式强制转换 bytea_output 默认更改(如果您使用 bytea,请更新您的客户端驱动程序,或更改设置) standard_conforming_strings默认更改(同样,如果需要临时可以改回来) 删除对隐式连接的向后兼容支持

【讨论】:

谢谢。我想知道是否是这种情况,但找不到关于何时引入 DO 块的文档。我很想升级并为此争论了很多次,但这不是我的决定——据我所知,这是运行 greenplum 的最新版本的 postgres。

以上是关于无法在 Greenplum 中使用 DO 执行匿名代码块的主要内容,如果未能解决你的问题,请参考以下文章

Greenplum问题:函数无法在段上执行,因为它访问关系

如何执行 GreenPlum 6.x 备份和恢复

Greenplum 执行计划之广播与重分布

脚本执行打印我脚本中的每个“DO”

无法在 Oracle 匿名块中调用和执行 .sql 脚本文件

无法从 Windows 上的 pgadmin 连接到 greenplum postgresql