<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zhyiwww
    用平實的筆,記錄編程路上的點點滴滴………
    posts - 536,comments - 394,trackbacks - 0

    CREATE FUNCTION

    Name

    CREATE FUNCTION — 定義一個新函數
    CREATE FUNCTION name ( [ ftype [, ...] ] )
        RETURNS rtype
        AS definition   
        LANGUAGE 'langname'
        [ WITH ( attribute [, ...] ) ]
    CREATE FUNCTION name ( [ ftype [, ...] ] )
        RETURNS rtype
        AS obj_file , link_symbol  
        LANGUAGE 'langname'
        [ WITH ( attribute [, ...] ) ]
      

    輸入

    name

    要創建的函數名.

    ftype

    函數參數的數據類型.輸入類型可以是基本類型,組合類型或者 opaqueOpaque 表明該函數接受一個非 SQL 類型,比如象 char * 這樣的類型。

    rtype

    返回數據類型.輸入類型可以是基本類型,組合類型, setof type, 或者 opaquesetof 修飾詞表示該函數 將返回一套條目,而不是單條條目。

    attribute

    一個關于函數的可選信息,用于優化。參閱下文獲取細節.

    definition

    一個定義函數的字串;其含義取決于(用的)語言。 可以是一個內部函數名,一個指向一個目標文件的路徑,一 個SQL查詢或者一種過程語言的文本。

    obj_file , link_symbol

    這種形式的 AS 子句用于動態鏈接的 C 語言函數, 這時該函數在 C 源代碼里的名稱和 SQL 函數的名稱不同。字符串 obj_file 是含有可動態裝載的對象的文件名,而 link_symbol是對象的鏈接符號, 這個符號與 C 源代碼里的函數名相同。

    langname

    可以是 'sql'?'C', 'internal' 或 'plname',這里 'plname' 是所創建過程的語言名.參考 CREATE LANGUAGE 獲取詳細信息.

    輸出

    CREATE

    命令成功地執行返回的信息.

    描述

    CREATE FUNCTION 允許一個 Postgres 用戶在一個數據庫里注冊一個函數. 并且這個用戶將被看作這個函數的所有者.

    函數屬性

    WITH 子句里可以出現下面的內容:

    iscachable

    iscachable 表示此函數在輸入 相同時總是返回相同的值 (也就是說, 它不做數據庫查找或者是使用沒有直接在它的參數列表出現的信息)。 優化器使用 iscachable 來認知對該函數的調用進行預先計算是否安全。

    isstrict

    isstrict 表明如果它的任何參數是 NULL,此函數總是返回 NULL. 如果聲明了這個屬性,則如果存在 NULL 參數時不會執行該函數; 而只是自動假設一個 NULL 結果.如果沒有聲明 isstrict 該函數將為 NULL 輸入調用并進行處理. 那么剩下的事就是函數作者的責任來檢查 NULL 是否必須并且做相應響應.

    注意

    請參閱 PostgreSQL 程序員手冊 關于通過函數擴展 Postgres 的章節獲取更多關于書寫外部函數的信息.

    使用 DROP FUNCTION 刪除一個用戶定義的函數.

    我們允許你將完整的 SQL92 類型語法用于 輸入參數和返回值.不過,有些類型聲明的細節(比如, numeric 類型的精度域)是由下層函數實現負責的, 并且會被 CREATE FUNCTION 命令悄悄地吞掉. (也就是說,不再被識別或強制).

    Postgres 允許函數“重載”; 也就是說,同一個函數名可以用于幾個不同的函數, 只要它們的參數可以區分它們。不過,這個功能在用于 internal 和 C 語言 的函數時要小心。

    兩個 internal 函數擁有相同 C 名稱時肯定會發生鏈接時錯誤。 要解決這個問題,給它們賦予不同的 C 名稱(例如,使用參數類 型做為 C 名稱的一部分),然后在 CREATE FUNCTION 的 AS 子句里面聲明這些名字。 如果 AS 子句為空,那么 CREATE FUNCTION 假設函數的 C 名稱與SQL名稱一樣。

    類似地,如果用多個 C 語言函數重載 SQL 函數, 給每個 C 語言函數的實例一個獨立的名稱,并且使用 CREATE FUNCTION 語法里的 AS 句的不同形式來確保重載的 SQL 函數名稱正確地解釋為相應動態鏈接對象。

    用法

    創建一個簡單的 SQL 函數:

    CREATE FUNCTION one() RETURNS int4
        AS 'SELECT 1 AS RESULT'
        LANGUAGE 'sql';
    SELECT one() AS answer;
    
         answer 
    --------
          1
        

    這個例子通過調用一個用戶創建的共享庫的路徑創建一個 C 函數. 該路徑計算一個檢測位并且如果函數參數里的檢測位 正確就返回一個 TRUE .這些是通過使用一個 CHECK 約束實現的.

    CREATE FUNCTION ean_checkdigit(bpchar, bpchar) RETURNS boolean
        AS '/usr1/proj/bray/sql/funcs.so' LANGUAGE 'c';
        
    CREATE TABLE product (
        id        char(8) PRIMARY KEY,
        eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}')
                          REFERENCES brandname(ean_prefix),
        eancode   char(6) CHECK (eancode ~ '[0-9]{6}'),
        CONSTRAINT ean    CHECK (ean_checkdigit(eanprefix, eancode))
    );
      

    這個例子創建一個在用戶定義類型 complex 和內部類型 point 之間做類型轉換的函數。該函數是用一個從 C 源代碼編譯的 動態裝載的對象來實現的。對于 Postgres 而言, 要自動尋找類型轉換函數,sql 函數必須和返回類型同名, 因而重載是不可避免的。 該函數名通過使用 SQL定義里 AS 子句的第二種類型來重載:

    CREATE FUNCTION point(complex) RETURNS point
        AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
        LANGUAGE 'c';
      

    該函數的 C 定義是:

    Point * complex_to_point (Complex *z)
    {
    	Point *p;
    
    	p = (Point *) palloc(sizeof(Point));
    	p->x = z->x;
    	p->y = z->y;
    		
    	return p;
    }
      

    兼容性

    SQL92

    CREATE FUNCTIONPostgres 語言的擴展.

    SQL/PSM

    注意: PSM 表示連續存儲模塊 (Persistent Stored Modules). 它是一個過程化的語言, SQL/PSM 是一個允許函數擴展性的標準.

    SQL/PSM CREATE FUNCTION 語法如下:
    CREATE FUNCTION name
        ( [ [ IN | OUT | INOUT ] type [, ...] ] )
         RETURNS rtype
         LANGUAGE 'langname'
         ESPECIFIC routineSQL-statement



    |----------------------------------------------------------------------------------------|
                               版權聲明  版權所有 @zhyiwww
                引用請注明來源 http://m.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2006-06-02 18:49 zhyiwww 閱讀(1522) 評論(0)  編輯  收藏 所屬分類: database
    主站蜘蛛池模板: 亚洲va精品中文字幕| 亚洲精品在线免费观看| 久久爰www免费人成| 久久久无码精品亚洲日韩京东传媒| 亚洲乱码在线卡一卡二卡新区| 午夜视频免费在线观看| 亚洲日本人成中文字幕| 4虎永免费最新永久免费地址| 亚洲午夜在线电影| 三级网站在线免费观看| 亚洲一区二区三区四区视频 | 国产麻豆免费观看91| xxxxx做受大片在线观看免费| 亚洲 小说区 图片区 都市| 99热这里有免费国产精品| 亚洲日韩图片专区第1页| 日本免费v片一二三区| 日本亚洲欧美色视频在线播放 | 国产白丝无码免费视频| 香蕉大伊亚洲人在线观看| 亚洲色成人中文字幕网站| 毛片在线播放免费观看| 亚洲欧美成人一区二区三区| 亚洲AV无码乱码国产麻豆穿越| 亚洲日韩国产精品乱-久| 亚洲精品无码久久久久| 久久久久久久99精品免费| 亚洲狠狠ady亚洲精品大秀| 亚洲福利中文字幕在线网址| 成在线人免费无码高潮喷水| 亚洲偷自拍另类图片二区| 日韩av无码久久精品免费| 国产亚洲精品美女久久久久久下载| 亚洲精品国产福利一二区| 日本一区午夜艳熟免费| 亚洲国产成人手机在线电影bd | 亚洲AV综合色区无码另类小说| 国产91免费在线观看| 亚洲hairy多毛pics大全| 亚洲午夜成激人情在线影院| 香蕉蕉亚亚洲aav综合|