Provided by: manpages-zh_1.5-1_all bug

NAME

       CREATE FUNCTION - 定義一虓s函數

SYNOPSIS

       CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
           RETURNS rettype
         { LANGUAGE langname
           | IMMUTABLE | STABLE | VOLATILE
           | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
           | [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
           | AS 'definition'
           | AS 'obj_file', 'link_symbol'
         } ...
           [ WITH ( attribute [, ...] ) ]

DESCRIPTIONyz
       CREATE  FUNCTION  定義一虓s的函數。  CREATE  OR  REPLACE  FUNCTION  將-
       n麼創建一虓s函數, n麼替換現有的定義。

        如果包含了一-
       蚍狾’W,那麼函數就在指定的模式中創建。否則它會在當前模式中創建。
       新函數的名字不能和同一蚍狾﹞云漸籉饃a有同樣參數類型的函數同名。
       不過,參數類型不同的函數可以同名(這叫做姜)。

        n更新一茞{有函數的定義,使用 CREATE OR REPLACE FUNCTION。 我怳ㄞ鄍帠o-
       茪隤k蚹鴾@茖蝻漲W字或者參數類型(如果你這麼幹,那麼你就會創建一-
       虓s的,不同的函數)。  同樣,CREATE  OR  REPLACE FUNCTION 也不會允許你-
       蚹鴾@茞{有函數的返回類型。 n做這些事情,你必須刪除並奐s創建函數。

        如果你刪除然後垂堣@-
       茖蝻A新函數和舊的將是不同的實體;你會破壞現有規則,視圖,觸發器等等。
       使用 CREATE OR REPLACE  FUNCTION  可以在不破壞引用該函數的對象的前提下-
       蚹翵蝻w義。

        創建這茖蝻漕洏峈怞足馬蝻漫狾釭怴C

PARAMETERS數
       name    n創建的函數名字。

       argtype
               該函數的數據類型(可以有模式-
              袡╮^。如果有的話,參數類型可以是基本類型,也可以是復合類型,域類型,或者和一-
              茞{有字段相同的類型。

               一茼r段的類型是用   tablename.columnname%TYPE   表示的;使用這-
              茠F西可以幫助函數獨立於表定義的蚹鵅C

               根據實現語言的不同,我攽晱i以在這上掄n明    "偽類型",     比如
              cstring。偽類型表示實際的參數類型n麼是沒有完整地聲明,-
              n麼是在普通的 SQL 數據類型之外。

       rettype
               返回數據類型。輸出類型可以聲明為一荌禰酵型,復合類型,域類型,
              或者從現有字段拷貝。參閱上     argtype     的描z獲取如何引用一-
              茞{有類型的信息。

               根據實現語言的不同,我攽晱i以在這上掄n明    "偽類型",     比如
              cstring。 SETOF 袡6表示該函數將返回一套條目, 而不是一條條目。

       langname
               用以實現函數的語言的名字。           可以是            SQL,C,
              internal,或者是使用者定義的過程語言名字。  (又見  createlang。
              ) 為了保持向下相容,該名字可以用單引號包圍。

       IMMUTABLE

       STABLE

       VOLATILE
               這些屬性告訴系統把對該函數的多次調用替換成一次是否安全。    主-
              n用於運行時優化。               至少應該聲明一蚇嚝隉C如果任何一-
              茬ㄗS有出現,那麼 VOLATILE 是預設假設。

              IMMUTABLE      表示該函數在給出同樣的參數匢`是返回相同的結果;
              也就是說,它不做數據庫查找或者是使用那些並沒有直接出現在其參數列表裏-
              悸澈H息。                                            如果給出這-
              蚇龠窗A那麼任何帶著全部是常量參數對該函數的調用都將立即替換為該函數的-
              C

              STABLE 表示在一次表掃描裏,對相同參數A  該函數將矇w返回相同的-
              A但是它的結果可能在不同  SQL 語句之間變化。 這蚇龠給翵漕痕G-
              尪鉏畬w查找,參數變量(比如當前時區),等等的函數是很合適的。
              還n注意  current_timestamp  族函數是  stable (矇w)的,因為它怐-
              b一次事務中不會變化。

              VOLATILE                 表示該函數雈i以在一次表掃描內改變,
              因此不會做任何優化。很少數據庫函數在這虓妝壑W是易變的;
              一些例子是                                 random(),currval(),
              timeofday()。請注意任何有副作用的函數都必需列為易變類,
              即使其結果相當有規律也應該這樣,這樣才能避免它被優化;一-
              茖狺l就是 setval()。

       CALLED ON NULL INPUT

       RETURNS NULL ON NULL INPUT

       STRICT CALLED  ON  NULL  INPUT  (預設)表明該函數在自己的某些參數是空-
              漁尕還是可以按照正常的方式調用。   剩下的事情是函數的作者必須-
              t責檢查空H及相應地做出反應。

              RETURNS  NULL  ON  NULL  INPUT  或 STRICT 表明如果它的任何參數是
              NULL,此函數總是返回 NULL。  如果聲明了這荌捊A則如果存在  NULL
              參數時不會執行該函數; 而只是自動假設一 NULL 結果。

       [EXTERNAL] SECURITY INVOKER

       [EXTERNAL] SECURITY DEFINER
              SECURITY     INVOKER    表明該函數將帶著調用它的使用者的權執行。
              這是預設。SECURITY   DEFINER   聲明該函數將以創建它的使用者的權-
              執行。

               關鍵字   EXTERNAL   的目的是和   SQL   相容,   但是我怍M   SQL
              不同的是,這荅S性不僅僅適用於外部的函數, 所以它是可選的。

       definition
               一茤w義函數的字串;含義取決於語言。它可以是一茪熙”蝻W字,
              一茷向某茈媦釔仵蛌爾纁|,一          SQL         查詢,或者一-
              茈庣L程語言寫的文本。

       obj_file, link_symbol
               這荍峖〞  AS  子句用於在函數的  C   源檔案裏的函數名字和   SQL
              函數的名字不同的時唹i動態裝載   C   語言函數。   字串   obj_file
              是包含可動態裝載的對象的檔名,而                     link_symbol
              是函數的鏈接符號,也就是該函數在        C       源檔案裏的名字。
              如果省略了鏈接符號,那麼就假設它和被定義的 SQL 函數同名。

       attribute
               歷史遺留的函數可選信息。下悸瘧搣吤i以在此出現:

              isStrict
                      等效於 STRICT 或者 RETURNS NULL ON NULL INPUT

              isCachable
                     isCachable                  是                  IMMUTABLE
                     的過時的等效物;不過出於向下相容,我怳斯M接受它。

        屬性名是大小寫無關的。

NOTES`N
        請參閱 ``User-Defined Functions'' 獲取更多關於書寫函數的信息。

        我怳像\你將完整的           SQL          類型語法用於輸入參數和返回C
       不過,有些類型聲明的細節(比如,numeric 類型的精度域)是由下層函數實現-
       t責的,       並且會被       CREATE      FUNCTION      命令悄悄地吞掉。
       (也就是說,不再被識別或強制)。

       PostgreSQL  允許函數姜;  也就是說,同一茖蝻W可以用於幾茪ㄕP的函數,
       只n它怐滌捊i以區分它怴C不過,所有函數的        C       名字必須不同,
       也就是說你必須給予姜的 C 函數不同的 C  名字(比如,使用參數類型作為  C
       名字的一部分)。

        如果契_調用         CREATE         FUNCTION,並且都指向同一茈媦釔仵蛂A
       那麼該檔案只裝載一次。-
       n卸載和恢復裝載該檔案(可能是在開發過程中),你可以使用  LOAD [load(7)]
       命令。

        使用 DROP FUNCTION 刪除一茖洏峈怍w義函數。

        函數定義裏悸漸籉馧璊瑏鼎峈怳炱袟b都必須用寫雙份的方式逃逸。

        n能定義函數,使用者必須對該語言有 USAGE  權。

EXAMPLESl
        這裏是一蚋眾瑼漕狺l,用於幫助你開始掌握這茤R令。  更多信息和例子,參閱
       ``User-Defined Functions''。

       CREATE FUNCTION add(integer, integer) RETURNS integer
           AS 'select $1 + $2;'
           LANGUAGE SQL
           IMMUTABLE
           RETURNS NULL ON NULL INPUT;

COMPATIBILITYe性
        在      SQL99      裏的確定義了一笏REATE      FUNCTION      PostgreSQL
       的和它類似但是不相容。                                              這-
       蚅搣坌O不可移植的,可以使用的不同語言也是如此。

SEE ALSO見
       ALTER  FUNCTION  [alter_function(7)], DROP FUNCTION [drop_function(7)],
       GRANT [grant(7)], LOAD [load(7)], REVOKE [revoke(7)], createlang(1)

者
       Postgresql  <laser@pgsqldb.org>