8

我正在尝试在 PostgreSQL 9.2 数据库中使用PL/R过程语言。我已经安装了该plr语言,并且正在尝试将其添加到数据库中。当我运行命令时,CREATE EXTENSION plr;我收到以下错误:

ERROR:  language "C" does not exist
STATEMENT:  CREATE EXTENSION plr;
ERROR:  language "C" does not exist

当我列出数据库中的可用语言时,select * from pg_language;我得到

 lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl 
 ----------+----------+---------+--------------+---------------+-----------+--------------+--------
  internal |       10 | f       | f            |             0 |         0 |         2246 | 
  c        |       10 | f       | f            |             0 |         0 |         2247 | 
  sql      |       10 | f       | t            |             0 |         0 |         2248 | 
  plpgsql  |       10 | t       | t            |         12514 |     12515 |        12516 | 
 (4 rows)

所以有一种语言c,但它不是大写字母(不确定这是否会有所不同)。

我想知道为什么plr扩展找不到C程序语言?

4

2 回答 2

13

您可能在 PostgreSQL 9.2 中遇到了这种变化(在此处引用发行说明):

CREATE FUNCTION 中不再强制小写程序语言名称 (Robert Haas)

虽然不带引号的语言标识符仍然小写,但字符串和带引号的标识符不再强制小写。因此,例如 CREATE FUNCTION ... LANGUAGE 'C' 将不再起作用;它必须拼写为“c”,或者最好省略引号。

它也反映在手册中CREATE FUNCTION

语言名

实现函数的语言名称。可以是SQLCinternal或用户定义的过程语言的名称。为了向后兼容,名称可以用单引号括起来。

至少从 7.3 版(可能更长)开始不鼓励引用语言名称,但显然旧习惯很难改掉。删除引号'C'可以解决问题,到达:LANGUAGE cLANGUAGE C

PL/R从项目页面来看,在这方面还没有为 PostgreSQL 9.2 做好准备。

来自乔康威的反馈

乔康威留下了一个被删除的答案,因为它应该是评论。我将它粘贴在这里以供看不到已删除答案的公众使用:

我收到了消息,只是还没有时间发布新的 PL/R 版本。在 12 月之前寻找它,但与此同时,上面提到的手动解决方法非常简单。

于 2012-09-21T12:04:15.850 回答
0

我对 pg_collkey 有类似的问题。我相信您的情况可能有相同的解决方案。这是我所做的:在你的 postgres 扩展目录中有一个 .sql 文件,它告诉 postgres 如何安装扩展。在我的例子中,它被称为 pg_collkey--0.5.0.sql。您需要修改该 sql 文件。在我的系统上(使用 Mac OS X 和 Homebrew),该文件位于 /usr/local/share/postgresql/extension/pg_collkey--0.5.0.sql)。它可能在 LANGUAGE 子句中包含一个大写的“C”,如下所示:

CREATE OR REPLACE FUNCTION collkey (text, text, bool, int4, bool) RETURNS bytea
  LANGUAGE 'C' IMMUTABLE STRICT AS
  '$libdir/collkey_icu.so',
  'pgsqlext_collkey';

将其更改为小写“c”并重新运行“CREATE EXTENSION pg_collkey;” psql中的命令:

psql -c 'CREATE EXTENSION pg_collkey;' my_database_name

当然,您需要使用“plr”而不是 pg_collkey 作为扩展名。

于 2012-12-07T15:57:34.340 回答