PostgreSQL
上一頁   下一頁

CREATE LANGUAGE

名稱

CREATE LANGUAGE ─ 為函數定義一個新的語言

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_languageLANCOMPILER 字段的字串。當前,Postgres 不使用這個字段。

輸出

CREATE
語言成功創建後返回的資訊。
ERROR: PL handler function funcname() doesn't exist
如果函數 funcname() 不存在,返回此資訊。

描述

使用 CREATE LANGUAGE,Postgres 用戶可以在 Postgres 裡註冊一個新的語言。因而,函數和觸發器程序可以用這種新語言定義。要註冊新語言用戶必須具有 Postgres 超級用戶權限。

書寫 PL 句柄

程序語言的調用句柄必須用一種編譯語言,比如說 'C',並且在 Postgres 裡註冊成一個無參數輸入,返回值是 opaque 型態(一個用於未聲明或未定義型態的容器)的函數。這就避免了調用句柄直接被查詢當作函數調用。

但是,要想在該句柄提供的語言裡進行PL函數或觸發器程序實際調用,就必須提供參數。

取得 pg_proc 表和分析被調程序參數和返回值型態的任務屬於調用句柄。程序中的 CREATE FUNCTION 的 AS 子句可在 pg_proc 表的 prosrc 字段裡找到。這裡有可能是程序語言的源文件本身(像 PL/Tcl),或者是一指向一個文件的路徑或是其他任何一個告訴調用句柄如何處理細節的東西。

注意

使用 CREATE FUNCTION 創建函數。

使用 DROP LANGUAGE 刪除一個程序語言。

請參考 pg_language 獲取更多資訊:

     Table    = pg_language
+--------------------------+--------------------------+-------+
|          Field           |          Type            | Length|
+--------------------------+--------------------------+-------+
| lanname                  | name                     |    32 |
| lancompiler              | text                     |   var |
+--------------------------+--------------------------+-------+

lanname |lancompiler   
--------+--------------
internal|n/a           
lisp    |/usr/ucb/liszt
C       |/bin/cc       
sql     |postgres
     
    

因為所有程序語言的調用句柄都必須在 Postgres 裡用'C' 語言註冊,因而它繼承了所有 'C' 函數的功能和限制。

目前,程序語言的定義一旦建立就不能更改。

用法

下面是一個用 'C' 寫的PL 句柄的模板。

#include "executor/spi.h"
#include "commands/trigger.h"
#include "utils/elog.h"
#include "fmgr.h"        /* for FmgrValues struct */
#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) {
          /*
           * Called as a function
           */

          retval = ...
     } else {
          /*
           * Called as a trigger procedure
           */
          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 LANGUAGE 是 Postgres 擴展。在 SQL92 裡 沒有 CREATE LANGUAGE 語句。


上一頁 首頁 下一頁
CREATE INDEX 開頭 CREATE OPERATOR