无法在 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 执行匿名代码块的主要内容,如果未能解决你的问题,请参考以下文章