PostgreSQL过程语言“;";找不到

PostgreSQL过程语言“;";找不到,postgresql,stored-procedures,keyword,capitalization,plr,Postgresql,Stored Procedures,Keyword,Capitalization,Plr,我试图在PostgreSQL 9.2数据库中使用过程语言。我已经安装了plr语言,并试图将其添加到数据库中。当我运行命令createextensionplr时我得到以下错误: ERROR: language "C" does not exist STATEMENT: CREATE EXTENSION plr; ERROR: language "C" does not exist 当我用select*from pg_language列出数据库中可用的语言时我明白了 lanname |

我试图在PostgreSQL 9.2数据库中使用过程语言。我已经安装了
plr
语言,并试图将其添加到数据库中。当我运行命令
createextensionplr时我得到以下错误:

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
过程语言?

您可能在PostgreSQL 9.2中遇到了这种变化(引用了:

在CREATE中不再强制使用小写程序语言名称 功能(罗伯特·哈斯)

虽然未加引号的语言标识符仍然是小写的,但字符串和 带引号的标识符不再强制按大小写。比如说 创建函数。。。语言“C”将不再工作;一定是 拼写为“c”,最好省略引号

这也反映在

语言名称

用于实现函数的语言的名称。可以是
SQL
C
internal
,也可以是用户定义过程的名称 语言。为了向后兼容,名称可以用 单引号

至少从7.3版(可能更长)开始,就不鼓励引用语言名称,但很明显,旧习惯很难改掉。删除
'C'
周围的引号可以解决此问题,从而得出:
语言C
语言C

PL/R
在这方面还没有为PostgreSQL 9.2做好准备,这是从

乔·康威的反馈 乔·康威留下的答案被删除了,因为它应该是一条评论。我将其粘贴到此处,供无法看到已删除答案的普通公众使用:

我得到消息,只是没有时间做一个新的PL/R版本。 在12月之前寻找它,但同时手动解决方法 上面提到的是非常简单的


我和pg_collkey也有类似的问题。我相信你的情况可能有同样的解决办法。我所做的是:postgres扩展目录中有一个.sql文件,告诉postgres如何安装扩展。在我的例子中,它被称为pg_collkey--0.5.0.sql。您需要修改该sql文件。在我的系统上(使用Mac OS X和自制),文件位于/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”,并在psql中重新运行“CREATE EXTENSION pg_collkey;”命令:

psql -c 'CREATE EXTENSION pg_collkey;' my_database_name

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

如果该语言不受信任,那么您必须是超级用户才能使用给定的语言创建函数(或语言)。您是否尝试从具有超级用户访问权限的帐户执行此操作?是否尝试指定小写字母“c”?在字符串中,大小写往往很重要。在字符串之外,通常不会。我有超级用户状态是。但是我如何指定小写字母“c”?你确定PL/R支持9.2吗?我想Joe Conway在PL/R的第8.3.0.13.1节中已经解决了这个问题。