<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
    主站蜘蛛池模板: 亚洲精品无码日韩国产不卡av| 免费在线观看中文字幕| 亚洲精品国精品久久99热一| 亚洲国产精品无码久久| 天天操夜夜操免费视频| 亚洲午夜精品一区二区麻豆| 在线A级毛片无码免费真人| 亚洲人成色在线观看| 国产美女a做受大片免费| 亚洲AV无码成人精品区狼人影院| 午夜成年女人毛片免费观看| 亚洲AV无码成人精品区日韩| 免费一级毛片在线观看| 免费无码又爽又黄又刺激网站| 亚洲中文无韩国r级电影| 巨胸喷奶水www永久免费| 国产aⅴ无码专区亚洲av| 特级无码毛片免费视频尤物| 亚洲大香伊人蕉在人依线| 永久在线毛片免费观看| 一级做a毛片免费视频| 亚洲影院在线观看| 大学生高清一级毛片免费| 男女猛烈激情xx00免费视频| 精品久久久久久亚洲| 麻豆高清免费国产一区| 亚洲国产精品ⅴa在线观看| 久久精品国产精品亚洲艾草网美妙 | 99久久免费精品视频| 亚洲欧洲专线一区| 亚洲第一区精品观看| 久草视频在线免费看| 亚洲砖码砖专无区2023| AV在线播放日韩亚洲欧| 亚洲视频免费播放| 色老头综合免费视频| 亚洲嫩草影院久久精品| 国产一区二区三区免费看| 日韩电影免费在线观看中文字幕| 亚洲中文字幕无码av| 亚洲人成图片小说网站|