【问题标题】:PostgreSQL procedural language "C" not found未找到 PostgreSQL 过程语言“C”
【发布时间】:2012-09-20 14:20:28
【问题描述】:

我正在尝试在 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 程序语言?

【问题讨论】:

  • 如果该语言不受信任,那么您必须是超级用户才能使用给定语言创建函数(或语言)。您是否尝试从具有超级用户访问权限的帐户执行此操作?
  • 您是否尝试指定小写“c”?在字符串中,大小写往往很重要。外部字符串,它通常不会。
  • 我确实有超级用户状态是的。但是我怎么能指定小写的'c'呢?
  • 你确定PL/R支持9.2吗?
  • 我认为 Joe Conway 在 PL/R 的 v.8.3.0.13.1 中已修复此问题。

标签: postgresql stored-procedures keyword capitalization plr


【解决方案1】:

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

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

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

这也反映在manual for CREATE FUNCTION

语言名称

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

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

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

Joe Conway 的反馈

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

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

【讨论】:

    【解决方案2】:

    我对 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 作为扩展名。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2018-05-23
      • 2021-12-18
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2022-06-14
      相关资源
      最近更新 更多