CREATE LANGUAGE

Name

CREATE LANGUAGE  --  関数用の新しい言語を定義する。

Synopsis

CREATE [ TRUSTED ] PROCEDURAL LANGUAGE 'langname'
    HANDLER call_handler
    LANCOMPILER 'comment'
  

入力

TRUSTED

TRUSTED はその言語の呼び出しハンド ラが安全であることを指定します。 つまり、権限のないユーザがアクセス制限を迂回できないようにする 機能です。このキーワードを省略して言語を登録した場合、 Postgres のスーパユーザ権限 を持つユーザのみ、新しい関数を生成するこの言語 ('C' 言語のように)を使用することができます。

langname

新しい手続き言語の名前。 言語名は大文字・小文字を区別しません。 手続き言語は Postgres に組み込まれている 言語を上書きすることができません。

HANDLER call_handler

call_handler は PL プロシージャを実行するために呼び出される、登録済の 関数の名前です。

comment

LANCOMPILER 引数は、新規の pg_language 項目の LANCOMPILER 属性に挿入される 文字列です。 現時点で Postgres は この属性を全く使用しません。

出力

CREATE

言語の作成に成功した場合に返されるメッセージ。

ERROR: PL handler function funcname() doesn't exist

funcname() 関数が存在しない場合に返されるエラー。

説明

CREATE LANGUAGE によって、 Postgres ユーザは Postgres に新しい言語を登録 することができます。 これにより、その新規言語を用いて関数やトリガプロシージャを 定義することができます。新規言語を登録するためには Postgres のスーパユーザの 権限が必要です。

PL ハンドラを書くには

手続き言語用の呼び出しハンドラは 'C' のようなコンパイラ言語 で記述された、引数を取らない、未指定、未定義型などのプレース ホルダである opaque 型を返す関数として Postgres に登録されなければなりま せん。 これは、呼び出しハンドラが直接問い合わせによって呼ばれる関数 として呼び出されることを防ぐものです。

とは言っても、ハンドラによって提供される言語を用いた PL 関数または トリガプロシージャが実行される場合、実際の呼び出しにおいて引数が 与えられなければなりません。

pg_proc 項目の取り出し、および、呼び出さ れたプロシージャの引数と戻される型の分析は、呼び出しハンドラに 依存します。 プロシージャの CREATE FUNCTION の AS 句は、pg_proc テーブル項目の prosrc 属性の中にあります。 これは、( PL/Tcl の場合のような)手続き言語のソース原文 そのものであったり、あるファイルのパス名であったり、 あるいは呼び出しハンドラに細部で何を行うのかを通知する なんらかのものであったりします。

注意

関数を作成する場合は CREATE FUNCTION を 使用して下さい。

手続き言語を削除する場合は DROP LANGUAGE を使用して下さい。

より詳しくは、pg_language テーブルを参照 して下さい。

        Table "pg_language"
   Attribute   |  Type   | Modifier
---------------+---------+----------
 lanname       | name    |
 lanispl       | boolean |
 lanpltrusted  | boolean |
 lanplcallfoid | oid     |
 lancompiler   | text    |

 lanname  | lanispl | lanpltrusted | lanplcallfoid | lancompiler
----------+---------+--------------+---------------+-------------
 internal | f       | f            |             0 | n/a
 C        | f       | f            |             0 | /bin/cc
 sql      | f       | f            |             0 | postgres

手続き言語用呼び出しハンドラは 'C' 言語で Postgres に登録されなければ なりませんので、 'C' 関数の全ての機能と制約事項が継承 されます。

現在では、一度作成されてしまった手続き言語の定義を変更する ことができません。

使用法

これは 'C' で作成された、PL ハンドラの雛型です。

#include "executor/spi.h"
#include "commands/trigger.h"
#include "utils/elog.h"
#include "fmgr.h"        /* FmgrValues 構造体用 */
#include "access/heapam.h"
#include "utils/syscache.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"

Datum
plsample_call_handler(
     Oid       prooid,
     int       pronargs,
     FmgrValues     *proargs,
     bool      *isNull)
{
     Datum          retval;
     TriggerData    *trigdata;

     if (CurrentTriggerData == NULL) {
          /*
           * 関数として呼び出された場合
           */

          retval = ...
     } else {
          /*
           * トリガプロシージャとして呼び出された場合
           */
          trigdata = CurrentTriggerData;
          CurrentTriggerData = NULL;

          retval = ...
     }

     *isNull = false;
     return retval;
}
   

PL 呼び出しハンドラを完結させるには些細なことではなく、 実際は数千行のコードを追加しなければなりません。 読み込み可能モジュールにコンパイルする方法に関する情報については CREATE FUNCTION を参照して下さい。

以下のコマンドで手続き言語の例を登録します。

CREATE FUNCTION plsample_call_handler () RETURNS opaque
    AS '/usr/local/pgsql/lib/plsample.so'
    LANGUAGE 'C';
CREATE PROCEDURAL LANGUAGE 'plsample'
    HANDLER plsample_call_handler
    LANCOMPILER 'PL/Sample';
   

互換性

SQL92

CREATE LANGUAGEPostgres の拡張です。 SQL92には CREATE LANGUAGE 文はありません。