| PostgreSQL | ||
|---|---|---|
| 上一頁 | 下一頁 | |
CREATE LANGUAGE ─ 為函數定義一個新的語言
CREATE [ TRUSTED ] PROCEDURAL LANGUAGE 'langname'
HANDLER call_handler
LANCOMPILER 'comment'
使用 CREATE LANGUAGE,Postgres 用戶可以在 Postgres 裡註冊一個新的語言。因而,函數和觸發器程序可以用這種新語言定義。要註冊新語言用戶必須具有 Postgres 超級用戶權限。
程序語言的調用句柄必須用一種編譯語言,比如說 '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';
CREATE LANGUAGE 是 Postgres 擴展。在 SQL92 裡 沒有 CREATE LANGUAGE 語句。
| 上一頁 | 首頁 | 下一頁 |
| CREATE INDEX | 開頭 | CREATE OPERATOR |