麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > PostgreSQL > 正文

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 語句.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 久久精品一二三区 | 亚洲成人中文字幕在线 | 成人店女老板视频在线看 | 91av在线免费观看 | 国产欧美日韩视频在线观看 | 国产成人午夜高潮毛片 | 久久久久久久久久网 | 久久av喷吹av高潮av懂色 | 国产精品午夜性视频 | 国产精品av久久久久久网址 | 一区二区三区日韩 | 黄污污网站 | 免费视频99| 国产资源视频在线观看 | 亚洲一区在线视频观看 | 国内精品久久久久久2021浪潮 | 久久久久99999 | 天天干导航 | 色婷婷一区二区三区 | av手机免费在线观看 | 色综合久久久久久 | 泰剧19禁啪啪无遮挡大尺度 | 精品一区二区三区不卡 | 91成人在线免费视频 | 国产精品视频在 | 91精品国产综合久久男男 | 欧美成人综合视频 | 欧美日韩国产综合网 | 精品亚洲一区二区 | 午夜精品久久久久久久爽 | 成人黄色小视频网站 | www.成人免费 | 97精品视频在线观看 | 国产亚洲精品成人a | 国产精品自拍啪啪 | a视频在线免费观看 | 色就色 综合偷拍区91网 | 在线观看一区二区三区四区 | 999久久久国产999久久久 | 永久免费在线观看av | 午夜视频在线 |