PostgreSQL7.0手冊-用戶手冊-19. SQL命令-CREATE INDEX
2019-09-08 23:32:59
供稿:網友
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_language 表 LANCOMPILER 字段的字串.當前,Postgres 不使用這個字段.
輸出
CREATE
語言成功創建后返回的信息.
ERROR: PL handler function funcname() doesn't exist
如果函數 funcname() 不存在,返回此信息.
描述
使用 CREATE LANGUAGE,Postgres 用戶可以在 Postgres 里注冊一個新的語言.因而,函數和觸發器過程可以用這種新語言定義.要注冊新語言用戶必須具有 Postgres 超級用戶權限.
書寫 PL 句柄
過程語言的調用句柄必須用一種編譯語言,比如說 'C',并且在 Postgres 里注冊成一個無參數輸入,返回值是 opaque 類型(一個用于未聲明或未定義類型的容器)的函數.這就避免了調用句柄直接被查詢當作函數調用.
但是,要想在該句柄提供的語言里進行PL函數或觸發器過程實際調用,就必須提供參數.
當從觸發器管理器調用時,唯一的參數是該過程的 pg_proc 對象ID.所有從觸發器管理器來的其他信息都可以通過全局量CurrentTriggerData 指針找到.
當從函數管理器里調用時,參數是過程 pg_proc 入口的對象標識(object ID),傳遞給PL函數的參數個數,在FmgrValues 一個結構里的參數和一個指向布爾變量的指針,函數通過這個指針告訴調用者返回值是否SQL NULL.
取得 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
因為所有過程語言的調用句柄都必須在 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 語句.