8

PostgreSQL9.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

lang_name

関数が実装されている言語の名前。、、、、またはユーザー定義の手続き型言語の名前にするSQLことができます。下位互換性のために、名前は一重引用符で囲むことができます。Cinternal

言語名を引用することは、少なくともバージョン7.3(おそらくそれ以上)以降は推奨されていませんが、古い習慣は明らかに死に絶えています。周囲の引用符を削除'C'すると、問題が修正され、次の場所に到達します:LANGUAGE cまたはLANGUAGE C

PL/Rプロジェクトページから判断すると、その点でPostgreSQL9.2の準備ができていませんでした。

JoeConwayからのフィードバック

Joe Conwayは、コメントである必要があるために削除された回答を残しました。削除された回答が表示されない一般の人のために、ここに貼り付けます。

新しいPL/Rリリースを行う時間がなかったというメッセージが表示されました。12月までにそれを探してください、しかしそれまでの間、上記の手動の回避策はかなり簡単です。

于 2012-09-21T12:04:15.850 に答える
0

pg_collkeyでも同様の問題が発生しました。私はあなたの状況が同じ解決策を持っているかもしれないと信じています。これが私がしたことです:あなたのpostgres拡張ディレクトリに拡張機能をインストールする方法をpostgresに指示する.sqlファイルがあります。私の場合、それは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」に変更して、「CREATEEXTENSIONpg_collkey;」を再実行してください。psqlのコマンド:

psql -c 'CREATE EXTENSION pg_collkey;' my_database_name

もちろん、拡張子名にはpg_collkeyの代わりに「plr」を使用する必要があります。

于 2012-12-07T15:57:34.340 に答える