CREATE FUNCTION (外部純量) 陳述式

CREATE FUNCTION (外部純量) 陳述式是用來在現行伺服器上登錄使用者定義的外部純量函數。 純量函數 會在每次呼叫時傳回單一值,而且在 SQL 表示式有效的一般情況下是有效的。

呼叫

此陳述式可以內嵌在應用程式中,或透過使用動態 SQL 陳述式來發出。 它是可執行的陳述式,只有在 DYNAMICRULES 執行行為對套件有效時才能動態準備 (SQLSTATE 42509)。

授權

陳述式的授權 ID 所持有的專用權必須至少包含下列其中一項權限:
  • 資料庫上的 IMPLICIT_SCHEMA 權限 (如果函數的隱含或明確綱目名稱不存在)。
  • 綱目的 CREATEIN 專用權 (如果函數的綱目名稱參照現有綱目的話)。
  • 綱目上的 SCHEMAADM 權限 (如果函數的綱目名稱參照現有綱目)。
  • DBADM 權限。
陳述式的授權 ID 所保留的專用權也必須包括下列其中一個權限:
  • 資料庫上的 CREATE_EXTERNAL_ROUTINE 權限。
  • SYSADM 權限。
  • 如果已設定 DB2_ALTERNATE_AUTHZ_BEHAVIOUR 登錄變數且包含值 EXTERNAL_ROUTINE_DBADM ,則為 DBADM 權限。
若要建立非隔離函數,陳述式的授權 ID 所保留的專用權也必須至少包括下列其中一個權限 (不適用於 OLE DB 外部表格函數或方法):
  • 資料庫上的 CREATE_NOT_FENCED_ROUTINE 權限。
  • SYSADM 權限。
  • DBADM 權限 (如果已設定 DB2_ALTERNATE_AUTHZ_BEHAVIOUR 登錄變數且包含值 NOT_FENCED_ROUTINE_DBADM)
    附註: Db2 11.5.8 安全特殊建置 29133 包括對 SYSADM 及 DBADM 權限之隱含權限的變更。 依預設, SYSADM 權限 (而非 DBADM 權限) 隱含地具有 CREATE_EXTERNAL_ROUTINE 及 CREATE_NOT_FENCED_ROUTINE 權限。 如果已設定 DB2_ALTERNATE_AUTHZ_BEHAVIOUR 登錄變數,且包含 EXTERNAL_ROUTINE_DBADM 或 NOT_FENCED_ROUTINE_DBADM 值,則 DBADM 權限也隱含地具有這些專用權。

語法

Read syntax diagramSkip visual syntax diagramCREATEOR REPLACE FUNCTIONfunction-name( ,parameter-declaration )RETURNS data-type2AS LOCATORdata-type3CAST FROMdata-type4AS LOCATOR option-list
parameter-declaration
Read syntax diagramSkip visual syntax diagram INOUT1INOUTparameter-name data-type1 default-clause AS LOCATOR
data-type1, data-type2, data-type3, data-type4
Read syntax diagramSkip visual syntax diagrambuilt-in-typedistinct-type-namestructured-type-nameREF(type-name)
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONCHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA2CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)NCHARNATIONALCHARCHARACTER(1)( integer)NVARCHARNCHAR VARYINGNATIONALCHARCHARACTERVARYING( integer)NCLOBNCHAR LARGE OBJECTNATIONAL CHARACTER LARGE OBJECT(1M)( integerKMG)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)XMLSYSPROC.DB2SECURITYLABEL34
default-clause
Read syntax diagramSkip visual syntax diagramDEFAULT NULLconstantspecial-registerglobal-variable(expression)
option-list
Read syntax diagramSkip visual syntax diagramLANGUAGE CJAVACLROLECPPPYTHON5 SPECIFICspecific-nameEXTERNAL NAME'string'identifier PARAMETER STYLE DB2GENERALJAVASQLNPSGENERIC PARAMETER CCSIDASCIIUNICODENOT DETERMINISTICDETERMINISTICFENCEDFENCEDTHREADSAFENOT THREADSAFENOT FENCEDTHREADSAFERETURNS NULL ON NULL INPUTCALLED ON NULL INPUTREADS SQL DATANO SQLCONTAINS SQLSTATIC DISPATCHEXTERNAL ACTIONNO EXTERNAL ACTIONNO SCRATCHPADSCRATCHPAD100lengthNO FINAL CALLFINAL CALLALLOW PARALLELDISALLOW PARALLELNO DBINFODBINFOTRANSFORM GROUPgroup-namePREDICATES(predicate-specification)INHERIT SPECIAL REGISTERSNOT SECUREDSECUREDSTAY RESIDENT NO
predicate-specification
Read syntax diagramSkip visual syntax diagramWHEN  =   <>  <   >   <=  >=  constantEXPRESSION ASexpression-name data-filterindex-exploitationindex-exploitationdata-filter
data-filter
Read syntax diagramSkip visual syntax diagramFILTER USING function-invocationcase-expression
index-exploitation
Read syntax diagramSkip visual syntax diagramSEARCH BY EXACT INDEX EXTENSIONindex-extension-nameexploitation-rule
exploitation-rule
Read syntax diagramSkip visual syntax diagramWHEN KEY(parameter-name1 )USEsearch-method-name( ,parameter-name2 )
Notes:
  • 1 OUT and INOUT are valid only if the function has LANGUAGE C.
  • 2 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
  • 3 DB2SECURITYLABEL is the built-in distinct type that must be used to define the row security label column of a protected table.
  • 4 For a column of type DB2SECURITYLABEL, NOT NULL WITH DEFAULT is implicit and cannot be explicitly specified (SQLSTATE 42842). The default value for a column of type DB2SECURITYLABEL is the session authorization ID's security label for write access.
  • 5 LANGUAGE SQL is also supported.

說明

或替換
指定如果現行伺服器上存在函數定義,則取代該函數的定義。 在型錄中取代新定義之前,會有效地捨棄現有定義,但不會影響對函數所授與的專用權除外。 此選項只能由物件的擁有者指定。 如果現行伺服器上不存在函數的定義,則會忽略此選項。 如果要取代現有的函數,新定義的特定名稱和函數名稱必須與舊定義的特定名稱和函數名稱相同,或新定義的簽章必須符合舊定義的簽章。 否則,會建立新的函數。

如果在橫列許可權或直欄遮罩的定義中參照函數,則無法置換函數 (SQLSTATE 42893)。

函數名稱
命名正在定義的函數。 它是指定函數的完整或不完整名稱。 function-name 的不完整形式是 SQL ID。 在動態 SQL 陳述式中,CURRENT SCHEMA 特別暫存器會用作不完整物件名稱的限定元。 在靜態 SQL 陳述式中,QUALIFIER 前置編譯 /bind 選項隱含地指定不完整物件名稱的限定元。 完整格式是 schema-name ,後面接著句點和 SQL ID。 如果第一個參數是結構化類型,則完整名稱不得與第一個參數的資料類型相同。

名稱 (包括隱含或明確限定元) ,以及每一個參數的參數數目和資料類型 (不考慮資料類型的任何長度、精準度或小數位數屬性) ,不得識別型錄中說明的函數或方法 (SQLSTATE 42723)。 不完整的名稱,以及參數的數目和資料類型,當然在其綱目內是唯一的,但在綱目之間不需要是唯一的。

如果指定兩部分的名稱,則 schema-name 不能以 SYS; 開頭。 否則,會引發錯誤 (SQLSTATE 42939)。

在述詞中用作關鍵字的名稱數已保留供系統使用,無法用作 function-name。 名稱為 OME、ANY、ALL、NOT 及、OR、ABWEEN、NULL、LIKE、EXISTS、IN、UNIQUE、OVERLAPS、LIKE、MATCH 及比較運算子。 未遵守此規則將導致錯誤 (SQLSTATE 42939)。

一般而言,如果函數的簽章有一些差異,則多個函數可以使用相同的名稱。

雖然沒有禁止,但外部使用者定義函數不應與內建函數同名,除非它是刻意置換。 提供具有不同意義的相同名稱 (例如, LENGTH、VALUE、MAX) ,具有一致引數 (作為內建純量或聚集函數) 的函數,會造成動態 SQL 陳述式的問題,或當靜態 SQL 應用程式重新連結時; 應用程式可能會失敗,甚至更糟,在提供不同結果時,可能會出現順利執行的情況。

(參數-宣告, ...)
識別函數的輸入參數數目,並指定每一個參數的模式、名稱、資料類型及選用預設值。 必須為函數預期接收的每一個參數指定清單中的一個登錄。 最多可以指定 90 個參數 (SQLSTATE 54023)。
您可以登錄沒有參數的函數; 括弧仍必須編碼,且沒有中間資料類型。 例如:
   CREATE FUNCTION WOOFER() ...

綱目內所有對應參數都不允許完全相同類型的兩個同名函數。 在此類型比較中不會考量長度、精準度及小數位數。 因此, CHAR (8) 和 CHAR (35) 被視為與 DECIMAL (11, 2) 和 DECIMAL (4, 3) 相同的類型。 指定給參數的弱類型化特殊類型,會被視為與特殊類型的來源類型相同的資料類型。 對於 Unicode 資料庫, CHAR (13) 和 GRAPHIC (8) 被視為相同類型。 有一些類型的進一步組合,會導致它們被視為此目的的相同類型,例如 DECIMAL 及 NUMERIC。 重複簽章會傳回錯誤 (SQLSTATE 42723)。

IN | OUT | INOUT
指定參數的模式。 如果函數傳回錯誤,則未定義 OUT 參數,且 INOUT 參數未變更。 預設值是 IN。
輸入
將參數識別為函數的輸入參數。 當傳回控制項時,對函數內的參數所做的任何變更都無法用於呼叫端環境定義。
輸出
將參數識別為函數的輸出參數。
函數必須以 LANGUAGE C (SQLSTATE 42613) 定義。
函數只能在複合 SQL (已編譯) 陳述式中的指派陳述式右側參照,且函數參照不能是表示式的一部分 (SQLSTATE 42887)。
INOUT
將參數識別為函數的輸入及輸出參數。
函數必須以 LANGUAGE C (SQLSTATE 42613) 定義。
函數只能在複合 SQL (已編譯) 陳述式中的指派陳述式右側參照,且函數參照不能是表示式的一部分 (SQLSTATE 42887)。
參數名稱
指定參數的選用名稱。 在述詞規格的 index-exploation 子句中,需要參數名稱來參照函數的參數。 名稱不能與參數清單中任何其他 parameter-name 相同 (SQLSTATE 42734)。
data-type1
指定參數的資料類型。 資料類型可以是內建資料類型、特殊類型、結構化類型或參照類型。 如需每一種內建資料類型的更完整說明,請參閱 CREATE TABLE。 並非所有語言都支援部分資料類型。 如需 SQL 資料類型與主語言資料類型之間對映的詳細資料,請參閱 對映至內嵌式 SQL 應用程式中 SQL 資料類型的資料類型
  • 以字元資料類型傳遞日期時間類型參數,並以 ISO 格式傳遞資料。
  • DECIMAL (及 NUMERIC) 與 LANGUAGE C 及 OLE (SQLSTATE 42815) 一起無效。
  • DECFLOAT 與 LANGUAGE C、COBOL、CLR、JAVA 及 OLE (SQLSTATE 42815) 一起無效。
  • XML 與 LANGUAGE OLE 一起無效。
  • 因為在函數內看到的 XML 值是在函數呼叫中作為參數傳遞之 XML 值的序列化版本,所以必須使用語法 XML AS CLOB(n)來宣告 XML 類型的參數。
  • CLR 不支援大於 28 的 DECIMAL 小數位數 (SQLSTATE 42613)。
  • 無法指定陣列類型 (SQLSTATE 42815)。
  • BINARY 及 VARBINARY 資料類型與 LANGUAGE CLR 及 OLE (SQLSTATE 42815) 搭配使用無效。
對於使用者定義特殊類型,參數的長度、精準度或小數位數屬性是特殊類型 (在 CREATE TYPE 上指定的那些類型) 的來源類型。 會傳遞特殊類型參數作為特殊類型的來源類型。 如果特殊類型的名稱不完整,資料庫管理程式會在 SQL 路徑中搜尋綱目來解析綱目名稱。

對於使用者定義的結構化類型,相關聯的轉換群組中必須存在適當的轉換函數。

對於參照類型,如果參數未限定範圍,則可以將參數指定為 REF (type-name)。

預設
指定參數的預設值。 預設值可以是常數、特別暫存器、廣域變數、表示式或關鍵字 NULL。 可以指定為預設值的特別暫存器與可以指定給直欄預設值的特別暫存器相同 (請參閱 CREATE TABLE 陳述式中的 default-clause )。 可以使用表示式將其他特別暫存器指定為預設值。

表示式可以是 表示式中所說明類型的任何表示式。 如果未指定預設值,則參數沒有預設值,且在呼叫程序時無法省略對應的引數。 表示式 的大小上限是 64K 個位元組。

預設表示式不得修改 SQL 資料 (SQLSTATE 428FL 或 SQLSTATE 429BL)。 表示式必須與參數資料類型 (SQLSTATE 42821) 指派相容。

在下列狀況中無法指定預設值:
  • 適用於 INOUT 或 OUT 參數 (SQLSTATE 42601)
  • 若為類型為 ARRAY、ROW 或 CURSOR 的參數 (SQLSTATE 429BB)
  • 對於同時指定 PREDICATES 子句之函數定義的參數 (SQLSTATE 42613)
傳址不傳值
指定將參數值的定位器傳遞給函數,而不是實際值。 僅針對具有 LOB 資料類型或基於 LOB 資料類型 (SQLSTATE 42601) 之特殊類型的參數指定 AS LOCATOR。 傳遞定位器而非值可能會導致傳遞至函數的位元組數減少,特別是當參數值非常大時。

AS LOCATOR 子句不會影響判斷是否可以升級資料類型,也不會影響函數解析中使用的函數簽章。

如果函數是 FENCED 且具有 NO SQL 選項,則無法指定 AS LOCATOR 子句 (SQLSTATE 42613)。

退貨
此必要子句會識別函數的輸出。
data-type2
指定輸出的資料類型。

在此情況下,適用於函數參數的考量與先前在 data-type1 中說明的外部函數參數完全相同。

傳址不傳值
對於 LOB 類型或基於 LOB 類型的特殊類型,可以新增 AS LOCATOR 子句。 這指出要從 UDF 傳遞 LOB 定位器,而非實際值。
data-type3 CAST FROM data-type4
指定輸出的資料類型。

此形式的 RETURNS 子句用來從函數碼所傳回的資料類型,將不同的資料類型傳回至呼叫陳述式。 例如,在中

   CREATE FUNCTION GET_HIRE_DATE(CHAR(6))
     RETURNS DATE CAST FROM CHAR(10)
     ...

函數碼會將 CHAR (10) 值傳回給資料庫管理程式,資料庫管理程式接著會將它轉換成 DATE ,並將該值傳遞給呼叫陳述式。 data-type4 必須可強制轉型為 data-type3 參數。 如果無法強制轉型,則會引發錯誤 (SQLSTATE 42880)。

因為 data-type3 的長度、精準度或小數位數可以從 data-type4推斷, 不需要 (但仍然需要 ) 以指定針對 data-type3指定的參數化類型的長度、精準度或小數位數。 可改用空括弧 (例如 VARCHAR () 可使用)。 無法使用 FLOAT () (SQLSTATE 42601) ,因為參數值指出不同的資料類型 (REAL 或 DOUBLE)。

特殊類型、陣列類型 及結構化類型無效,因為在 data-type4 中指定了類型 (SQLSTATE 42815)。

強制轉型作業也會受到執行時期檢查的影響,這可能會導致發生轉換錯誤。

傳址不傳值
對於 data-type4 規格 (LOB 類型或基於 LOB 類型的特殊類型) ,可以新增 AS LOCATOR 子句。 這指出要從 UDF 傳回 LOB 定位器,而不是實際值。
內建類型
如需內建資料類型的說明,請參閱 CREATE TABLE
SPECIFIC specific-name
為正在定義的函數實例提供唯一名稱。 在此函數上尋找貨源、捨棄函數或加註函數時,可以使用此特定名稱。 它永遠無法用來呼叫函數。 specific-name 的不完整格式是 SQL ID。 完整格式是 schema-name ,後面接著句點和 SQL ID。 名稱 (包括隱含或明確限定元) 不得識別存在於應用程式伺服器上的另一個函數實例或方法規格; 否則會引發錯誤 (SQLSTATE 42710)。

specific-name 可能與現有的 function-name相同。

如果未指定限定元,則會使用用於 function-name 的限定元。 如果指定限定元,則它必須與 function-name 的明確或隱含限定元相同,否則會引發錯誤 (SQLSTATE 42882)。

如果未指定 specific-name ,資料庫管理程式會產生唯一名稱。 唯一名稱是 SQL ,後面接著字元時間戳記 SQlyymmddhhmmssxxx。

外部
此子句指出正在使用 CREATE FUNCTION 陳述式,根據以外部程式設計語言撰寫的程式碼,並遵循所記載的鏈結慣例及介面來登錄新的函數。

如果未指定 NAME 子句,則會假設 NAME function-name

NAME 'string'
此子句識別實作所定義函數的使用者撰寫程式碼名稱。

'string' 選項是最多 254 個位元組的字串常數。 用於字串的格式取決於指定的 LANGUAGE。

  • 若為語言 C:

    指定的 string 是檔案庫中的檔案庫名稱及函數,資料庫管理程式會呼叫它來執行所建立的使用者定義函數。 執行 CREATE FUNCTION 陳述式時,程式庫 (及程式庫內的函數) 不需要存在。 不過,在 SQL 陳述式中使用函數時,檔案庫中的檔案庫及函數必須存在且可從資料庫伺服器機器存取; 否則會傳回錯誤 (SQLSTATE 42724)。

    string 可以指定如下:
    Read syntax diagramSkip visual syntax diagram ' library_idabsolute_path_id !func_id '

    單引號內不允許多餘的空白。

    library_id
    識別包含函數的檔案庫名稱。 資料庫管理程式將尋找檔案庫,如下所示:
    作業系統 檔案庫名稱位置

    Linux®
    AIX®

    如果提供 myfunc 作為 library_id,且正在從 /u/production執行資料庫管理程式,則資料庫管理程式會在程式庫 /u/production/sqllib/function/myfunc 中尋找函數。
    Windows 資料庫管理程式將在 LIBPATH 或 PATH 環境變數指定的目錄路徑中尋找函數
    絕對路徑 ID
    識別包含函數之檔案的完整路徑名稱。 格式視作業系統而定,如下表所示:
    作業系統 完整路徑名稱範例

    Linux
    AIX

    值 '/u/jchui/mylib/myfunc' 會導致資料庫管理程式在 /u/jchui/mylib 中尋找 myfunc 共用程式庫。
    Windows 值 'd:\mylib\myfunc.dll' 會導致資料庫管理程式從 d:\mylib 目錄載入動態鏈結程式庫 myfunc.dll。 如果使用絕對路徑 ID 來識別常式主體,請務必附加 .dll 副檔名。
    ! func_id
    識別要呼叫之函數的進入點名稱。 ! 充當程式庫 ID 與函數 ID 之間的定界字元。 格式視作業系統而定,如下表所示:
    作業系統 函數的進入點名稱

    Linux
    AIX

    值 'mymod!func8' 會引導資料庫管理程式尋找程式庫 $inst_home_dir/sqllib/function/mymod ,並在該程式庫內使用進入點 func8
    Windows 值 'mymod!func8' 會引導資料庫管理程式載入 mymod.dll 檔,並在動態鏈結程式庫 (DLL) 中呼叫 func8() 函數。

    如果字串格式不正確,則會傳回錯誤 (SQLSTATE 42878)。

    每個外部函數的主體都應該位於每個資料庫分割區上可用的目錄中。

  • 若為 LANGUAGE JAVA:

    指定的 字串 包含選用的 Jar 檔 ID、類別 ID 及方法 ID ,資料庫管理程式會呼叫這些 ID 來執行所建立的使用者定義函數。 執行 CREATE FUNCTION 陳述式時,類別 ID 及方法 ID 不需要存在。 如果指定 jar_id ,當執行 CREATE FUNCTION 陳述式時,它必須存在。 不過,在 SQL 陳述式中使用函數時,方法 ID 必須存在且可從資料庫伺服器機器存取; 否則會傳回錯誤 (SQLSTATE 42724)。

    string 可以指定如下:

    Read syntax diagramSkip visual syntax diagram ' jar_id : class_id .! method_id '

    單引號內不允許多餘的空白。

    jar_id
    識別在資料庫中安裝 jar 集合時,提供給 jar 集合的 jar ID。 它可以是簡式 ID 或綱目完整 ID。 範例有 'myJar' 和 'mySchema.myJar'。
    class_id
    識別 Java™ 物件的類別 ID。 如果類別是套件的一部分,則類別 ID 部分必須包括完整套件字首,例如 'myPacks.UserFuncs'。 Java 虛擬機器將在其中尋找類別的目錄取決於作業系統,如下表所示:
    作業系統 Java 虛擬機器將在其中尋找類別的目錄

    Linux
    AIX

    '.../myPacks/UserFuncs/'
    Windows '...\myPacks\UserFuncs\'
    方法 ID
    識別要呼叫之 Java 物件的方法名稱。
  • 對於 LANGUAGE CLR:

    指定的 字串 代表 .NET 組件 (程式庫或執行檔)、該組件內的類別,以及資料庫管理程式為了執行所建立的函數而呼叫之類別內的方法。 執行 CREATE FUNCTION 陳述式時,模組、類別及方法不需要存在。 不過,在 SQL 陳述式中使用函數時,模組、類別及方法必須存在且可從資料庫伺服器機器存取; 否則會傳回錯誤 (SQLSTATE 42724)。

    使用 '/clr' 編譯器選項編譯以指出它們包括受管理程式碼延伸的 C++ 常式必須編目為 'LANGUAGE CLR' ,而不是 'LANGUAGE C'。 資料庫伺服器必須知道 .NET 基礎架構正在使用者定義的函數中使用,才能做出必要的執行時期決策。 所有使用 .NET 基礎架構的使用者定義函數都必須編目為 'LANGUAGE CLR'。

    string 可以指定如下:
    Read syntax diagramSkip visual syntax diagram ' assembly : class_id ! method_id '

    名稱必須以單引號括住。 不允許多餘的空白。

    組件
    識別類別所在的 DLL 或其他組件檔。 必須指定任何副檔名 (例如 .dll)。 如果未提供完整路徑名稱,則檔案必須位於資料庫產品安裝路徑的功能目錄中

    例如,c:\sqllib\function

    如果檔案位於安裝功能目錄的子目錄中,則可以在檔名之前提供子目錄,而不是指定完整路徑。

    例如,如果您的安裝目錄是 c:\sqllib ,且您的組件檔是 c:\sqllib\function\myprocs\mydotnet.dll,則只需要為組件指定 'myprocs\mydotnet.dll' 即可。

    此參數的區分大小寫與檔案系統的區分大小寫相同。

    class_id
    指定給定組件內要呼叫之方法所在的類別名稱。 如果類別位於名稱空間內,則除了類別之外,還必須提供完整名稱空間。 例如,如果類別 EmployeeClass 位於名稱空間 MyCompany.ProcedureClasses中,則必須為類別指定 MyCompany.ProcedureClasses.EmployeeClass 。 請注意,部分 .NET 語言的編譯器會將專案名稱新增為類別的名稱空間,且行為可能會因使用指令行編譯器或 GUI 編譯器而有所不同。 此參數區分大小寫。
    方法 ID
    指定給定類別內要呼叫的方法。 此參數區分大小寫。
  • 對於 LANGUAGE OLE:

    指定的 字串 是 OLE 程式化 ID (progid) 或類別 ID (clsid) ,以及資料庫管理程式為了執行所建立的使用者定義函數而呼叫的方法 ID。 執行 CREATE FUNCTION 陳述式時,程式化 ID 或類別 ID 及方法 ID 不需要存在。 不過,在 SQL 陳述式中使用函數時,方法 ID 必須存在且可從資料庫伺服器機器存取; 否則會傳回錯誤 (SQLSTATE 42724)。

    string 可以指定如下:
    Read syntax diagramSkip visual syntax diagram ' progidclsid ! method_id '

    單引號內不允許多餘的空白。

    progid
    識別 OLE 物件的程式化 ID。

    資料庫管理程式不會解譯 progid ,只會在執行時期轉遞至 OLE API。 指定的 OLE 物件必須可建立且支援延遲連結 (也稱為 IDispatch 型連結)。

    clsid
    識別要建立之 OLE 物件的類別 ID。 在 OLE 物件未以 progid 登錄的情況下,可以使用它作為替代方案來指定 progidclsid 的格式如下:
    {nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}
    其中 ' n' 是英數字元。 資料庫管理程式不會解譯 clsid ,只會在執行時期轉遞至 OLE API。
    方法 ID
    識別要呼叫之 OLE 物件的方法名稱。
  • 對於 LANGUAGE CPP:

    指定的 字串 是程式庫中的程式庫 ID 和類別 ID ,其中包含資料庫管理程式為了執行所建立的使用者定義函數而呼叫的 evaluate 方法。 如果字串格式不正確,則會傳回錯誤 (SQLSTATE 42878)。

    執行 CREATE FUNCTION 陳述式時,程式庫 (或程式庫內的類別) 不需要存在。 不過,在 SQL 陳述式中使用函數時,檔案庫中的檔案庫及類別必須存在且可從資料庫伺服器機器存取; 否則會傳回錯誤 (SQLSTATE 42724)。

    每個外部函數的主體都應該位於每個資料庫分割區上可用的目錄中。

    string 可以指定如下:
    Read syntax diagramSkip visual syntax diagram ' library_idabsolute_path_id ! class_id '
    單引號內不允許多餘的空白。
    library_id
    包含函數的檔案庫名稱:
    • 在 UNIX 系統上,如果指定的程式庫 ID 是 myfunc,且正在從 /u/production執行資料庫管理程式,則資料庫管理程式會在下列程式庫中尋找函數:
      /u/production/sqllib/function/myfunc
    • 在 Windows 作業系統上,資料庫管理程式會在 LIBPATH 或 PATH 環境變數指定的目錄路徑中尋找函數。
    絕對路徑 ID
    包含函數之檔案的完整路徑。 例如:
    • 在 UNIX 系統上,下列規格會導致資料庫管理程式在 /u/jchui/mylib 中尋找 myfunc 共用程式庫:
      '/u/jchui/mylib/myfunc'
    • 在 Windows 作業系統上,下列規格會使資料庫管理程式從 d:\mylib 目錄載入動態鏈結程式庫 myfunc.dll :
      'd:\mylib\myfunc.dll'
      如果使用絕對路徑 ID 來識別常式主體,請務必附加 .dll 副檔名。
    class_id
    包含要呼叫之方法的類別名稱。
    例如,如果您指定 'mymod!myclass':
    • 在 UNIX 系統上,資料庫管理程式會尋找程式庫 $inst_home_dir/sqllib/function/mymod ,並在該程式庫中呼叫 myclass 類別的 evaluate 方法。
    • 在 Windows 作業系統上,資料庫管理程式會載入 mymod.dll 檔案,並在動態鏈結程式庫 (DLL) 中呼叫 myclass 類別的 evaluate 方法。
NAME identifier
這個指定的 ID 是 SQL ID。 SQL ID 用作字串中的 library-id 。 除非它是有定界字元的 ID ,否則 ID 會摺疊成大寫。 如果使用綱目名稱來限定 ID ,則會忽略綱目名稱部分。 此形式的 NAME 只能與 LANGUAGE C 搭配使用。
語言
此必要子句指定撰寫使用者定義函數主體的語言介面慣例。
C
資料庫管理程式會呼叫使用者定義的函數,如同它是 C 函數一樣。 使用者定義函數必須符合標準 ANSI C 原型所定義的 C 語言呼叫及鏈結慣例。
JAVA
資料庫管理程式會將使用者定義函數當作 Java 類別中的方法來呼叫。
CLR
資料庫管理程式會以 .NET 類別中的方法來呼叫使用者定義的函數。 只有在 Windows 作業系統上執行的使用者定義函數才支援 LANGUAGE CLR。 無法對 CLR 常式指定 NOT FENCED (SQLSTATE 42601)。
主控台
資料庫管理程式會呼叫使用者定義的函數,如同它是 OLE 自動化物件所公開的方法一樣。 使用者定義函數必須符合 OLE 自動化資料類型及呼叫機制,如 OLE Automation Programmer 's Reference中所述。

只有在 Windows 作業系統中,此資料庫產品的使用者定義函數才支援 LANGUAGE OLE。 無法對以 LANGUAGE OLE (SQLSTATE 42613) 定義的 UDF 指定 THREADSAFE。

CPP
資料庫管理程式會呼叫 C++ 類別的 evaluate 方法,來呼叫使用者定義的函數。
Python
資料庫管理程式會以 Python 類別中的方法來呼叫使用者定義函數。
參數樣式
此子句用於指定用於將參數傳遞至函數並從函數傳回值的使用慣例。
DB2GENERAL
用來指定將參數傳遞至 Java 類別中定義為方法的外部函數並從中傳回值的慣例。 只有在使用 LANGUAGE JAVA 時,才能指定此選項。

值 DB2GENRL 可以用作 DB2GENERAL的同義字。

JAVA
這表示函數將使用符合 Java 語言及 SQLJ 常式規格的參數傳遞慣例。 只有在使用 LANGUAGE JAVA 時,未將結構化資料類型指定為參數,且未將 CLOB、BLOB 或 DBCLOB 資料類型指定為傳回類型 (SQLSTATE 429B8) 時,才能指定此選項。 PARAMETER STYLE JAVA 函數不支援 FINAL CALL、SCRATCHPAD 或 DBINFO 子句。
SQL
用於指定用於將參數傳遞至外部函數並從外部函數傳回值的慣例,這些函數符合 C 語言呼叫及鏈結慣例、OLE 自動化物件所公開的方法、 或 .NET 物件的公用靜態方法。 This must be specified when LANGUAGE C、LANGUAGE CLR、 or LANGUAGE OLE is used.
NPSGENERIC

用來指定將參數傳遞至 C++ 類別中定義為方法的外部函數,以及從這些外部函數傳回值的慣例。 只有在 LANGUAGE 選項設為 CPP 或 Python時,才能指定此選項。

當指定 NSPGENERIC 作為參數樣式時,會以 C++ 撰寫 UDF 作為 nz.udx_ver2.Udf 類別。 除了建構子和解構子之外,類別還必須實作下列兩種方法:
static Udf * Udf: :instantiate (UdxInit *pInit)
靜態成員方法 instantiate () ,它必須實例化 UDF 衍生類別的新實例,並將指標作為類別 Udf 指標傳回新實例。 引擎會使用此方法來建立 UDF 物件的實例。
virtual ReturnValue Udf: :evaluate ()
成員方法 evaluate () ,由引擎呼叫以評估使用者函數並將值傳回給呼叫程式。
參數 CCSID
指定要用於傳入及輸出函數的所有字串資料的編碼方法。 如果未指定 PARAMETER CCSID 子句,則對於 UNICODE 資料庫,預設值為 PARAMETER CCSID UNICODE ,而對於所有其他資料庫,則為 PARAMETER CCSID ASCII。
ASCII
指定以資料庫字碼頁編碼字串資料。 如果資料庫是 Unicode 資料庫,則無法指定 PARAMETER CCSID ASCII (SQLSTATE 56031)。 當呼叫函數時,函數的應用程式字碼頁是資料庫字碼頁。
UNICODE
指定以 Unicode 編碼字串資料。 如果資料庫是 Unicode 資料庫,則字元資料為 UTF-8,圖形資料為 UCS-2。 如果資料庫不是 Unicode 資料庫,則字元資料為 UTF-8。 在任一情況下,當呼叫函數時,該函數的應用程式字碼頁是 1208。

如果資料庫不是 Unicode 資料庫,且已建立具有 PARAMETER CCSID UNICODE 的函數,則函數不能具有任何圖形類型、XML 類型或使用者定義類型 (SQLSTATE 560C1)。

如果資料庫不是 Unicode 資料庫,且已在資料庫配置中指定替代對照順序,則可以使用 PARAMETER CCSID ASCII 或 PARAMETER CCSID UNICODE UNICODE 來建立函數。 所有傳入及輸出函數的字串資料都會轉換成適當的字碼頁。

此子句不能與 語言 CPP , LANGUAGE OLE、LANGUAGE JAVA 或 LANGUAGE CLR (SQLSTATE 42613) 一起指定。

DETERMINISTIC 或 NOT DETERMINISTIC
此選用子句指定函數是否一律傳回給定引數值 (DETERMINISTIC) 的相同結果,或函數是否相依於影響結果的部分狀態值 (NOT DETERMINISTIC)。 也就是說, DETERMINISTIC 函數必須一律從具有相同輸入的連續呼叫傳回相同的結果。 指定 NOT DETERMINISTIC 可防止最佳化利用相同輸入一律產生相同結果的事實。 NOT DETERMINISTIC 函數的範例是亂數產生器。 DETERMINISTIC 函數的範例是決定輸入平方根的函數。
FENCED NOT FENCED
此子句指定是否將函數視為 安全 ,以在資料庫管理程式作業環境的處理程序或位址空間中執行。

如果函數登錄為 FENCED ,則資料庫管理程式會保護其內部資源 (例如,資料緩衝區) 不受函數存取。 大部分函數將具有以 FENCED 或 NOT FENCED 執行的選項。 一般而言,以 FENCED 執行的函數不會像以 NOT FENCED 執行的類似函數一樣執行。

警告:
對未適當編碼、檢閱及測試的函數使用 NOT FENCED ,可能會危及資料庫的完整性。 此資料庫產品可防範許多常見類型的意外失敗,但在使用 NOT FENCED 使用者定義函數時,無法保證完整完整性。

只能對具有 LANGUAGE OLE 或 NOT THREADSAFE 的函數指定 FENCED (SQLSTATE 42613)。

如果函數是 FENCED 且具有 NO SQL 選項,則無法指定 AS LOCATOR 子句 (SQLSTATE 42613)。

指定 NOT FENCED 子句 (SQLSTATE 42601) 時,無法建立 LANGUAGE CLR 使用者定義函數。

THREADSAFE NOT THREADSAFE
指定是否將函數視為在與其他常式 (THREADSAFE) 相同的處理程序中執行的安全功能 (NOT THREADSAFE)。
如果使用 OLE 以外的 LANGUAGE 定義函數:
  • 如果函數定義為 THREADSAFE ,則資料庫管理程式可以在與其他常式相同的處理程序中呼叫函數。 一般而言,若要成為安全執行緒,函數不應使用任何廣域或靜態資料區。 大部分程式設計參照包括撰寫安全執行緒常式的討論。 FENCED 和 NOT FENCED 函數都可以是 THREADSAFE。
  • 如果函數定義為 NOT THREADSAFE ,則資料庫管理程式絕不會在與另一個常式相同的處理程序中同步呼叫函數。

對於 FENCED 函數,如果 LANGUAGE 是 JAVA 或 CLR,則 THREADSAFE 是預設值。 對於所有其他語言, NOT THREADSAFE 是預設值。 如果以 LANGUAGE OLE 定義函數,則不能指定 THREADSEAN (SQLSTATE 42613)。

對於 NOT FENCED 函數, THREADSAFE 是預設值。 無法指定 NOT THREADSAFE (SQLSTATE 42613)。

在空值輸入上傳回空值 在空值輸入上呼叫
如果有任何引數是空值,此選用子句可用來避免呼叫外部函數。 如果使用者定義的函數定義為沒有參數,則無法產生此空值引數條件,而且此規格的編碼方式並不重要。 如果未指定此子句,則預設值為 RETURNS NULL ON NULL INPUT ,但指定 PARAMETER STYLE JAVA 時除外,在此情況下,預設值為 CALLED ON NULL INPUT。

如果指定 RETURNS NULL ON NULL INPUT ,且在執行時,如果函數的任何一個引數是空值,則不會呼叫使用者定義函數,且結果是空值。

如果指定 CALLED ON NULL INPUT ,則不論任何引數是否為空值,都會呼叫使用者定義函數。 它可以傳回空值或一般 (非空值) 值。 但 UDF 負責測試空值引數值。

值 NULL CALL 可以用作 CALLED ON NULL INPUT 的同義字,以取得舊版及系列相容性。 同樣地, NOT NULL CALL 可以作為 RETURNS NULL ON NULL INPUT 的同義字。

READS SQL DATA、NO SQL 或 CONTAINS SQL
指定函數可以執行的 SQL 陳述式分類。 資料庫管理程式會驗證函數問題的 SQL 陳述式是否與此規格一致。

如需每一個陳述式的分類,請參閱 可在常式及觸發程式中執行的 SQL 陳述式

預設值為 READS SQL DATA。

READS SQL DATA
指定函數可以執行具有 READS SQL DATA、CONTAINS SQL 或 NO SQL (SQLSTATE 38002 或 42985) 資料存取分類的陳述式。 函數無法執行修改資料的 SQL 陳述式。 (SQLSTATE 38003 或 42985)。
無 SQL
指定函數只能執行資料存取分類為 NO SQL (SQLSTATE 38001) 的 SQL 陳述式。
CONTAINS SQL
指定函數只能執行資料存取分類為 CONTAINS SQL 或 NO SQL (SQLSTATE 38004 或 42985) 的 SQL 陳述式。 函數無法執行任何讀取或修改資料的 SQL 陳述式 (SQLSTATE 38003 或 42985)。
靜態分派
此選用子句指出在函數解析時,資料庫伺服器會根據函數參數的靜態類型 (宣告的類型) 來選擇函數。
外部動作 沒有外部動作
指定函數是否採取動作來變更資料庫管理程式未管理之物件的狀態。 外部動作的範例是傳送訊息或將記錄寫入檔案。 預設值為 EXTERNAL ACTION。
EXTERNAL ACTION
指定函數採取動作來變更資料庫管理程式未管理之物件的狀態。

如果函數由平行作業執行,則具有外部動作的函數可能會傳回不正確的結果。 例如,如果函數針對每一個起始呼叫傳送一個附註,則會針對每一個平行作業傳送一個附註,而不是針對函數傳送一次。 針對無法正確與平行化搭配使用的函數,指定 DISALLOW PARALLEL 子句。

NO EXTERNAL ACTION
指定函數不採取任何動作來變更資料庫管理程式未管理之物件的狀態。 在 SQL 陳述式最佳化期間,資料庫管理程式會使用此資訊。
無 SCRATCHPAD SCRATCHPAD 長度
此選用子句可用來指定是否要為外部函數提供 scratchpad。 (強烈建議重新進入使用者定義的函數,以便立即運算簿為函數提供從一個呼叫到下一個呼叫 儲存狀態 的方法。)
  • 如果指定 SCRATCHPAD ,則在第一次呼叫使用者定義函數時,會為外部函數要使用的 scratchpad 配置記憶體。 在每次呼叫使用者定義函數時,都會將額外的引數傳遞至外部函數,以解決立即運算簿。 此即時運算簿具有下列性質:
    • length(如果指定) 會設定立即運算簿的大小 (以位元組為單位); 此值必須介於 1 與 32 767 之間 (SQLSTATE 42820)。 預設大小為 100 個位元組。
    • 它會起始設定為所有 X'00 ''。
    • 其範圍是 SQL 陳述式。 SQL 陳述式中每個外部函數的參照都有一個立即運算簿。 因此,如果使用 SCRATCHPAD 關鍵字定義下列陳述式中的 UDFX 函數,則會指派三個立即運算簿。
         SELECT A, UDFX(A) FROM TABLEB
           WHERE UDFX(A) > 103 OR UDFX(A) < 19

      如果指定或預設為 ALLOW PARALLEL ,則範圍與先前顯示的範圍不同。 如果在多個資料庫分割區中執行函數,則會針對 SQL 陳述式中函數的每一個參照,在處理函數的每一個資料庫分割區中指派立即運算簿。 同樣地,如果在啟用分割區內平行化的情況下執行查詢,則可以指派三個以上的立即運算簿。

    • 它是持續性的。 它的內容會從一個外部函數呼叫保留到下一個外部函數呼叫。 在一個呼叫上由外部函數對 scratchpad 所做的任何變更都將在下一個呼叫上出現。 在開始執行每一個 SQL 陳述式時,資料庫管理程式會起始設定 scratchpades。 在開始執行每一個子查詢時,資料庫管理程式可能會重設即時運算簿。 如果指定 FINAL CALL 選項,則系統會在重設立即運算簿之前發出最終呼叫。
    • 它可以用作外部函數可能獲得的系統資源 (例如,記憶體) 的中心點。 此函數可以在第一次呼叫時取得記憶體,將其位址保留在立即運算簿中,並在後續呼叫中參照它。

      (在獲得系統資源的情況下,也應該指定 FINAL CALL 關鍵字; 這會導致在陳述式結尾進行特殊呼叫,以容許外部函數釋放任何獲得的系統資源。)

  • 如果未指定 SCRATCHPAD ,則不會配置立即運算簿或將立即運算簿傳遞給外部函數。

SCRATCHPAD 不能與 PARAMETER STYLE JAVA 函數一起指定。

FINAL CALL NO FINAL CALL
此選用子句指定是否對外部函數進行最終呼叫。 這種最終呼叫的目的是使外部功能能夠釋放它所獲得的任何系統資源。 在外部函數取得系統資源 (例如記憶體) 並將它們固定在立即運算簿中的情況下,它可以與 SCRATCHPAD 關鍵字一起使用。
  • 如果指定 FINAL CALL ,則在執行時,會將其他引數傳遞給指定呼叫類型的外部函數。 呼叫類型如下:
    正常呼叫
    會傳遞 SQL 引數,且預期會傳回結果。
    第一次呼叫
    針對此 SQL 陳述式中使用者定義函數的此參照,對外部函數的第一次呼叫。 第一個呼叫是正常呼叫。
    最終呼叫
    外部函數的最終呼叫,可讓函數釋放資源。 最終呼叫不是正常呼叫。 此最終呼叫會在下列時間發生:
    END-OF-STATEMENT
    當游標導向陳述式的游標關閉時,或當陳述式已完成否則執行時,即會發生此情況。
    平行作業結束
    當由平行作業執行函數時,即會發生此情況。
    交易結束或岔斷
    當未發生正常陳述式結尾時,即會發生此情況。 例如,應用程式的邏輯可能會因某些原因而略過游標關閉。 在此類型的最終呼叫期間,除了 CLOSE 游標 (SQLSTATE 38505) 之外,無法發出任何 SQL 陳述式。 在 呼叫類型 引數中,會以特殊值指出這種類型的最終呼叫。
    如果在定義為 WITH HOLD 的游標開啟時發生確定作業,則會在後續關閉游標或應用程式結束時進行最終呼叫。
  • 如果指定 NO FINAL CALL ,則不會將 呼叫類型 引數傳遞至外部函數,且不會進行最終呼叫。
FINAL CALL 無法與下列參數設定一起指定:
  • 參數樣式 JAVA
  • language cpp
ALLOW PARALLEL DISALLOW PARALLEL
此選用子句指定對於函數的單一參照,函數的呼叫是否可以平行化。 一般而言,大部分純量函數的呼叫應該可平行化,但可能有無法平行化的函數 (例如,那些取決於 scratchpad 單一副本的函數)。 如果針對純量函數指定 ALLOW PARALLEL 或 DISALLOW PARALLEL ,則會接受此規格。 在決定哪個關鍵字適合函數時,應該考量下列問題。
  • 所有 UDF 呼叫是否完全彼此獨立? 若為 YES ,則指定 ALLOW PARALLEL。
  • 每一個 UDF 呼叫是否會更新 scratchpad ,並提供下一次呼叫感興趣的值? (例如,計數器的增量。) 如果是,則指定 DISALLOW PARALLEL 或接受預設值。
  • UDF 是否應該只在一個資料庫分割區上執行一些外部動作? 如果是,則指定 DISALLOW PARALLEL 或接受預設值。
  • 是否使用立即運算簿,但只為了讓部分昂貴的起始設定處理程序可以執行最少次數? 若為 YES ,則指定 ALLOW PARALLEL。
  • 是否要在存取 直欄組織 表格的查詢中呼叫函數? 如果是,則指定 ALLOW PARALLEL 可能會增進效能。

在任何情況下,每個外部函數的主體都應該位於每個資料庫分割區上可用的目錄中。

預設值為 ALLOW PARALLEL ,除非在陳述式中指定下列一個以上選項。
  • 不確定
  • EXTERNAL ACTION
  • Scratchpad
  • FINAL 呼叫
如果指定或隱含其中任何選項,則預設值為 DISALLOW PARALLEL。
繼承特別暫存器
此選用子句指定函數中可更新的特別暫存器將從呼叫陳述式的環境繼承其起始值。 對於在游標的 select 陳述式中呼叫的函數,當開啟游標時,會從環境繼承起始值。 對於巢狀物件中呼叫的常式 (例如觸發程式或視圖) ,起始值繼承自執行時期環境 (非繼承自物件定義)。

特別暫存器的變更不會傳回函數的呼叫程式。

不可更新的特別暫存器 (例如日期時間特別暫存器) 會反映目前執行的陳述式內容,因此會設為其預設值。

NO DBINFO DBINFO
此選用子句指定是否將資料庫伺服器已知的特定資訊作為額外呼叫時間引數 (DBINFO) 或不 (NO DBINFO) 傳遞至 UDF。 NO DBINFO 是預設值。 下列子句不支援 DBINFO (SQLSTATE 42613):
  • LANGUAGE OLE
  • 參數樣式 JAVA
如果指定 DBINFO ,則會將結構傳遞至 UDF ,其中包含下列資訊:
  • 資料庫名稱-目前連接的資料庫名稱。
  • 應用程式 ID-針對資料庫的每一個連線所建立的唯一應用程式 ID。
  • 應用程式授權 ID-應用程式執行時期授權 ID ,不論此 UDF 與應用程式之間的巢狀 UDF 為何。
  • 字碼頁-識別資料庫字碼頁。
  • 綱目名稱-在與表格名稱完全相同的條件下,包含綱目名稱; 否則為空白。
  • 表格名稱-如果且僅當 UDF 參照是 UPDATE 陳述式中 SET 子句的右側,或 INSERT 陳述式之 VALUES 清單中的項目,則包含要更新或插入之表格的不完整名稱; 否則為空白。
  • 直欄名稱-在與表格名稱完全相同的條件下,包含要更新或插入的直欄名稱; 否則為空白。
  • 資料庫版本/版次-識別呼叫 UDF 之資料庫伺服器的版本、版次及修正層次。
  • 平台-包含伺服器的平台類型。
  • 表格函數結果直欄號碼-不適用於外部純量函數。
轉換群組 群組名稱
指出在呼叫函數時要用於使用者定義結構化類型轉換的轉換群組。 如果函數定義包括使用者定義的結構化類型作為參數或傳回資料類型,則需要轉換。 如果未指定此子句,則會使用預設群組名稱 DB2_FUNCTION 。 如果未對參照的結構化類型定義指定 (或預設值) group-name ,則會發生錯誤 (SQLSTATE 42741)。 如果給定的群組名稱及結構化類型未定義必要的 FROM SQL 或 TO SQL 轉換函數,則會引發錯誤 (SQLSTATE 42744)。

不論是指定或隱含的 FROM SQL 和 TO SQL 轉換函數,都必須是在結構化類型及其內建類型屬性之間適當地轉換的 SQL 函數。

述詞
定義在述詞中使用此函數時所執行的過濾或索引延伸開發。 述詞規格容許指定搜尋條件的選用 SELECTIVITY 子句。 如果指定 PREDICATES 子句,則函數必須定義為 DETERMINISTIC ,且沒有 EXTERNAL ACTION (SQLSTATE 42613)。 如果指定 PREDICATES 子句,且資料庫不是 UNICODE 資料庫,則不得指定 PARAMETER CCSID UNICODE (SQLSTATE 42613)。
WHEN comparison-operator
使用比較運算子 (=<>>=<=<>) 來建立述詞中函數的特定用法。
常數
指定常數值,其資料類型可與函數的 RETURNS 類型 (SQLSTATE 42818) 比較。 當述詞搭配使用此函數與相同的比較運算子及此常數時,最佳化工具會考量指定的過濾及索引開發。
EXPRESSION AS 表示式名稱
提供表示式的名稱。 當述詞搭配使用此函數與相同的比較運算子及表示式時,可能會使用過濾及索引開發。 會指派表示式名稱給表示式,以便將它用作搜尋函數引數。 expression-name 不能與所建立函數的任何 parameter-name 相同 (SQLSTATE 42711)。 指定表示式時,會識別表示式的類型。
FILTER USING
容許使用外部函數或觀察值表示式的規格,來進行結果表格的其他過濾。
function-invocation
指定過濾器函數,可用來執行結果表格的其他過濾。 這是已定義函數 (在述詞中使用) 的版本,可減少必須在其上執行使用者定義述詞的列數,以判定列是否合格。 如果索引產生的結果接近使用者定義述詞預期的結果,則套用過濾函數可能是多餘的。 如果未指定,則不會執行資料過濾。

此函數可以使用任何 參數名稱表示式名稱或常數作為引數 (SQLSTATE 42703) ,並傳回整數 (SQLSTATE 428E4)。 回覆值 1 表示保留該列,否則會捨棄該列。

此函數也必須:
  • 未使用 LANGUAGE SQL 定義 (SQLSTATE 429B4)
  • 未使用 NOT DETERMINISTIC 或 EXTERNAL ACTION 定義 (SQLSTATE 42845)
  • 沒有結構化資料類型作為任何參數的資料類型 (SQLSTATE 428E3)
  • 不包含子查詢 (SQLSTATE 428E4)
  • 不包括 XMLQUERY 或 XMLEXISTS 表示式 (SQLSTATE 428E4)
如果引數呼叫另一個函數或方法,則也會針對此巢狀函數或方法施行這些規則。 不過,只要引數評估為內建資料類型,就容許系統產生的觀察程式方法作為過濾函數 (或用作引數的任何函數或方法) 的引數。

函數的定義者必須對指定的過濾函數具有 EXECUTE 專用權。

在資料庫字碼頁中, function-invocation 子句長度不得超過 65 536 個位元組 (SQLSTATE 22001)。

case-expression
指定 case 表示式,以進行結果表格的其他過濾。 searched-when-clausesimple-when-clause 可以使用 parameter-name表示式名稱或常數 (SQLSTATE 42703)。 可以使用具有在 FILTER USING function-invocation 中指定的規則的外部函數作為結果表示式。 case-expression 中參照的任何函數或方法也必須符合 function-invocation下列出的四個規則。

子查詢和 XMLQUERY 或 XMLEXISTS 表示式無法在 case-expression (SQLSTATE 428E4) 中的任何位置使用。

case 表示式必須傳回整數 (SQLSTATE 428E4)。 結果表示式中的回覆值 1 表示保留該列; 否則會捨棄該列。

在資料庫字碼頁中, case-invocation 子句長度不得超過 65 536 個位元組 (SQLSTATE 22001)。

索引開發
根據可用來利用索引之索引延伸的搜尋方法,定義一組規則。
SEARCH BY INDEX EXTENSION index-extension-name
識別索引延伸。 index-extension-name 必須識別現有的索引延伸。
EXACT
指出在述詞評估方面,索引查閱是確切的。 使用 EXACT 指出在索引查閱之後,不需要套用原始使用者定義述詞函數或過濾器。 當索引查閱傳回與述詞相同的結果時, EXACT 述詞很有用。

如果未指定 EXACT ,則在索引查閱之後套用原始使用者定義述詞。 如果預期索引只提供述詞的近似值,請勿指定 EXACT 選項。

如果未使用索引查閱,則必須套用過濾器函數及原始述詞。

開發-規則
說明搜尋目標和搜尋引數,以及如何使用它們透過索引延伸中定義的搜尋方法來執行索引搜尋。
WHEN KEY (parameter-name1)
這會定義搜尋目標。 一個索引鍵只能指定一個搜尋目標。 parameter-name1 值可識別已定義函數的參數名稱 (SQLSTATE 42703 或 428E8)。

parameter-name1 的資料類型必須符合索引擴充中指定之來源索引鍵的資料類型 (SQLSTATE 428EY)。 必須完全符合內建及特殊資料類型,且在結構化類型的相同結構化類型階層內。

當具名參數的值是根據所指定索引擴充的索引所涵蓋的直欄時,此子句為 true。

USE search-method-name(parameter-name2)
這會定義搜尋引數。 它會從索引延伸中定義的搜尋方法中識別要使用的搜尋方法。 search-method-name 必須符合索引延伸中定義的搜尋方法 (SQLSTATE 42743)。 parameter-name2 值可識別 EXPRESSION AS 子句中所定義函數或 expression-name 的參數名稱 (SQLSTATE 42703)。 它必須不同於搜尋目標中指定的任何參數名稱 (SQLSTATE 428E9)。 每一個 parameter-name2 的參數數目及資料類型必須符合為索引延伸中的搜尋方法定義的參數 (SQLSTATE 42816)。 必須完全符合內建及特殊資料類型,且在結構化類型的相同結構化類型階層內。
不安全或安全
指定針對橫列及直欄存取控制是否將函數視為安全。 預設值是 NOT SECURED。
不安全
指出未將功能視為安全。 呼叫函數時,函數的引數不得參照已啟用直欄遮罩且已針對其表格啟動直欄層次存取控制的直欄 (SQLSTATE 428HA)。 此規則適用於在陳述式中任何位置呼叫的非安全使用者定義函數。
SECURED
指出將功能視為安全。 在橫列許可權或直欄遮罩中參照函數 (SQLSTATE 428H8) 時,函數必須是安全的。
停留在居住地,無
指定在函數結束之後,為函數載入的檔案庫不會保持常駐在記憶體中。 在下列情況下會忽略此子句:
  • 已指定 NOT FENCED 子句。
  • LANGUAGE 選項設為 JAVA 或 CLR。

注意事項

  • 判定一個資料類型是否可強制轉型為另一個資料類型,不會考量參數化資料類型 (例如 CHAR 及 DECIMAL) 的長度或精準度及小數位數。 因此,由於嘗試將來源資料類型的值強制轉型為目標資料類型的值,因此使用函數時可能會發生錯誤。 例如, VARCHAR 可強制轉型為 DATE ,但如果來源類型實際定義為 VARCHAR (5) ,則使用函數時會發生錯誤。
  • 選擇使用者定義函數參數的資料類型時,請考量將影響其輸入值的促銷規則 (請參閱 資料類型的促銷)。 例如,可用作輸入值的常數可能具有不同於預期的內建資料類型,更重要的是,可能不會升級至預期的資料類型。 根據促銷活動的規則,通常建議對參數使用下列資料類型:
    • INTEGER 而非 SMALLINT
    • DOUBLE 而非 REAL
    • VARCHAR 而非 CHAR
    • VARGRAPHIC 而非 GRAPHIC
  • 為了跨平台的 UDF 可攜性,不應使用下列資料類型:
    • FLOAT-改用 DOUBLE 或 REAL。
    • NUMERIC-改用 DECIMAL。
    • LONG VARCHAR-改用 CLOB (或 BLOB)。
  • 函數及方法可能不在置換關係中 (SQLSTATE 42745)。 如需置換的相關資訊,請參閱 CREATE TYPE (結構化)
  • 函數的簽章可能與方法不同 (比較函數的第一個 參數類型 與方法的 subject-type ) (SQLSTATE 42723)。
  • 建立綱目名稱不存在的函數將導致隱含建立該綱目,前提是陳述式的授權 ID 具有 IMPLICIT_SCHEMA 權限。 綱目擁有者是 SYSIBM。 已將綱目上的 CREATEin 專用權授與 PUBLIC。
  • 在分割的資料庫環境中,不支援在外部使用者定義函數或方法中使用 SQL (SQLSTATE 42997)。
  • 只能使用定義為 NO SQL 的常式來定義索引擴充 (SQLSTATE 428F8)。
  • 如果函數容許 SQL ,則外部程式不得嘗試存取任何聯合物件 (SQLSTATE 55047)。
  • 將呼叫定義為 NOT FENCED 的 Java 常式,如同它已定義為 FENCED THREADSAFE 一樣。
  • 只有在指定 PARAMETER STYLE DB2GENERAL 子句時,才在 LANGUAGE JAVA 外部函數中支援 XML 參數。
  • 表格存取限制

    如果函數定義為 READS SQL DATA ,則函數中沒有任何陳述式可以存取呼叫函數之陳述式所修改的表格 (SQLSTATE 57053)。 例如,假設使用者定義函數 BONUS () 定義為 READS SQL DATA。 如果呼叫陳述式 UPDATE EMPLOYEE SET SALARY = SALARY + 紅利 (EMPNO) ,則 BONUS 函數中沒有 SQL 陳述式可以從 EMPLOYEE 表格讀取。

  • 預設值的設定: 當呼叫函數時,以預設值定義的函數參數會設為其預設值,但只有在未提供對應引數的值或在呼叫函數時指定為 DEFAULT 時才會如此。
  • 專用權: 函數的定義者一律會收到函數上的 EXECUTE 專用權 WITH GRANT OPTION ,以及捨棄函數的權限。

    在 SQL 陳述式中使用函數時,函數定義者必須對函數使用的任何套件具有 EXECUTE 專用權,或對包含套件的綱目具有 EXECUTEIN 專用權或 DATAACCESS 權限。

  • EXTERNAL ACTION 函數: 如果在最外層的選取清單以外呼叫 EXTERNAL ACTION 函數,則結果無法預期,因為呼叫函數的次數會根據使用的存取計劃而有所不同。
  • 替代語法: 為了與此資料庫產品的舊版及其他資料庫產品相容,支援下列替代語法。 這些替代方案是非標準的,不應該使用。
    • PARAMETER STYLE DB2SQL 可以指定來取代 PARAMETER STYLE SQL
    • NOT VARIANT 可以指定來取代 DETERMINISTIC ,而 VARIANT 可以指定來取代 NOT DETERMINISTIC
    • 可以指定 NULL CALL 來取代 CALLED ON NULL INPUT ,也可以指定 NOT NULL CALL 來取代 RETURNS NULL ON NULL INPUT
    接受下列語法作為預設行為:
    • ASUTIME 無限制
    • 無 COLLID
    • 程式類型子項
    • 停留在居住地,無
    • Unicode 資料庫中的 CCSID UNICODE
    • 非 Unicode 資料庫中的 CCSID ASCII (如果未指定 PARAMETER CCSID UNICODE)
  • 建立安全函數: 通常具有 SECADM 權限的使用者沒有建立資料庫物件 (例如觸發程式和函數) 的專用權。 通常; 他們會檢查函數所存取的資料,確定它是安全的,然後將 CREATE_SECURE_OBJECT 權限授與目前具有建立安全使用者定義函數所需專用權的人員。 建立函數之後,它們會從函數擁有者撤銷 CREATE_SECURE_OBJECT 權限。

    SECURED 屬性被視為宣告使用者已針對使用者定義函數的所有變更建立變更控制審核程序的主張。 資料庫管理程式會假設此類控制審核程序適用於所有後續 ALTER FUNCTION 陳述式或外部套件的變更。

  • 在安全函數中呼叫其他使用者定義函數: 如果安全使用者定義函數呼叫其他使用者定義函數,則資料庫管理程式不會驗證那些巢狀使用者定義函數是否具有 SECURED 屬性。 如果那些巢狀函數可以存取機密資料,則具有 SECADM 權限的使用者需要確保容許那些函數存取那些資料,並且已針對那些函數的所有變更建立變更控制審核程序。
  • 取代現有的函數,使安全屬性變更 (從 SECURED 變更為 NOT SECURED ,反之亦然): 相依於函數的套件及動態快取 SQL 陳述式可能會失效,因為安全屬性會影響涉及表格的存取路徑選擇,而這些表格已啟動列或直欄層次存取控制。

範例

  1. 「圓柔」正在其 PELLOW 綱目中登錄 CENTER 函數。 讓那些將預設執行此動作的關鍵字,並讓系統提供函數特定名稱:
       CREATE FUNCTION CENTER (INT,FLOAT)
         RETURNS FLOAT
         EXTERNAL NAME 'mod!middle'
         LANGUAGE C
         PARAMETER STYLE SQL
         DETERMINISTIC
         NO SQL
         NO EXTERNAL ACTION
  2. 現在, McBride (具有 DBADM 權限) 正在 PELLOW 綱目中登錄另一個 CENTER 函數,為其提供明確的特定名稱以供後續資料定義語言使用,並明確提供所有關鍵字值。 另請注意,此函數使用 scratchpad ,且可能正在累計影響後續結果的資料。 因為已指定 DISALLOW PARALLEL ,所以對函數的任何參照都不會平行化,因此會使用單一立即運算簿來執行部分僅一次的起始設定並儲存結果。
       CREATE FUNCTION PELLOW.CENTER (FLOAT, FLOAT, FLOAT)
         RETURNS DECIMAL(8,4) CAST FROM FLOAT
         SPECIFIC FOCUS92
         EXTERNAL NAME 'effects!focalpt'
         LANGUAGE C   PARAMETER STYLE SQL
         DETERMINISTIC   FENCED   NOT NULL CALL   NO SQL   NO EXTERNAL ACTION
         SCRATCHPAD   NO FINAL CALL 
         DISALLOW PARALLEL
  3. 下列範例是撰寫來實作規則 output = 2 * input - 4 的 C 語言使用者定義函數程式,只有在輸入是空值時才會傳回空值。 如果 CREATE FUNCTION 陳述式已使用 NOT NULL CALL ,則可以更簡單地撰寫它 (亦即,沒有空值檢查)。 CREATE FUNCTION 陳述式:
       CREATE FUNCTION ntest1 (SMALLINT)
         RETURNS SMALLINT
         EXTERNAL NAME 'ntest1!nudft1'
         LANGUAGE C    PARAMETER STYLE SQL
         DETERMINISTIC   NOT FENCED   NULL CALL
         NO SQL   NO EXTERNAL ACTION
    程式碼:
    #include "sqlsystm.h"
    /* NUDFT1 IS A USER_DEFINED SCALAR FUNCTION */
    /* udft1 accepts smallint input
    and produces smallint output
    implementing the rule:
    if (input is null)
    set output = null;
    else
    set output = 2 * input - 4;
    */
    void SQL_API_FN nudft1
    (short *input,      /* ptr to input arg */
    short *output,     /* ptr to where result goes */
    short *input_ind,  /* ptr to input indicator var */
    short *output_ind, /* ptr to output indicator var */
    char sqlstate[6],  /* sqlstate, allows for null-term */
    char fname[28],    /* fully qual func name, nul-term */
    char finst[19],    /* func specific name,  null-term */
    char msgtext[71])  /* msg text buffer,     null-term */
    {
    /* first test for null input */
    if (*input_ind == -1)
    {
    /* input is null, likewise output */
    *output_ind = -1;
    }
    else
    {
    /* input is not null.  set output to 2*input-4 */
    *output = 2 * (*input) - 4;
    /* and set out null indicator to zero */
    *output_ind = 0;
    }
    /* signal successful completion by leaving sqlstate as is */
    /* and exit */
    return;
    }
    /* end of UDF: NUDFT1 */
  4. 下列範例會登錄 Java UDF ,它會傳回字串中第一個母音的位置。 UDF 以 Java 撰寫,將以隔離方式執行,並且是類別 javaUDFs的 findvwl 方法。
       CREATE FUNCTION findv ( CLOB(100K))
         RETURNS INTEGER
         FENCED
         LANGUAGE JAVA
         PARAMETER STYLE JAVA
         EXTERNAL NAME 'javaUDFs.findvwl'
         NO EXTERNAL ACTION
         CALLED ON NULL INPUT 
         DETERMINISTIC
         NO SQL
  5. 此範例概述使用者定義述詞 WITHIN ,其中採用類型為 SHAPE 的兩個參數 g1 及 g2:
    CREATE FUNCTION within (g1 SHAPE, g2 SHAPE)
    RETURNS INTEGER
    LANGUAGE C
    PARAMETER STYLE SQL
    DETERMINISTIC
    NOT FENCED
    NO SQL
    NO EXTERNAL ACTION
    EXTERNAL NAME 'db2sefn!SDESpatilRelations'
    PREDICATES
    WHEN = 1
    FILTER USING mbrOverlap(g1..xmin, g1..ymin, g1..xmax, g1..max,
    g2..xmin, g2..ymin, g2..xmax, g2..ymax)
    SEARCH BY INDEX EXTENSION gridIndex
    WHEN KEY(g1) USE withinExplRule(g2)
    WHEN KEY(g2) USE withinExplRule(g1)
    Within 函數的說明與任何使用者定義函數的說明類似,但下列新增項目指出此函數可以在使用者定義述詞中使用。
    • PREDICATES WHEN = 1 指出當此函數顯示為
         within(g1, g2) = 1
      在 DML 陳述式的 WHERE 子句中,述詞會被視為使用者定義述詞,而索引延伸 gridIndex 所定義的索引應該用來擷取滿足此述詞的列。 如果指定常數,則在 DML 陳述式期間指定的常數必須完全符合建立索引陳述式中指定的常數。 提供此條件主要是為了涵蓋結果類型為 1 或 0 的布林表示式。 對於其他情況, EXPRESSION 子句是更好的選擇。
    • FILTER USING mbrOverlap 參照過濾函數 mbrOverlap,這是較便宜的 INNER 述詞版本。 在此範例中, mbrOverlap 函數會採用最小外切矩形作為輸入,並快速判定它們是否重疊。 如果兩個輸入形狀的最小外切矩形不重疊,則 g1 將不會與 g2一起包含。 因此,可以安全地捨棄值組,避免套用昂貴的 WITHIN 述詞。
    • SEARCH BY INDEX EXTENSION 子句指出索引延伸和搜尋目標的組合可用於此使用者定義述詞。
  6. 此範例概述使用者定義述詞 DISTANITY ,它採用 POINT 類型的兩個參數 P1 和 P2作為輸入:
       CREATE FUNCTION distance (P1 POINT, P2 POINT)
         RETURNS INTEGER
         LANGUAGE C
         PARAMETER STYLE SQL
         DETERMINISTIC
         NOT FENCED
         NO SQL
         NO EXTERNAL ACTION
         EXTERNAL NAME 'db2sefn!SDEDistances'
         PREDICATES
         WHEN > EXPRESSION AS distExpr
         SEARCH BY INDEX EXTENSION gridIndex
         WHEN KEY(P1) USE distanceGrRule(P2, distExpr)
         WHEN KEY(P2) USE distanceGrRule(P1, distExpr)

    DISTANCE 函數的說明與任何使用者定義函數的說明類似,但下列新增項目指出在述詞中使用此函數時,該述詞是使用者定義的述詞。

    • PREDICATES WHEN> EXPRESSION AS distExpr 是另一個有效的述詞規格。 在 WHEN 子句中指定表示式時,該表示式的結果類型會用來判斷述詞是否為 DML 陳述式中使用者定義的述詞。 例如:
         SELECT T1.C1
           FROM T1, T2
           WHERE distance (T1.P1, T2.P1) > T2.C2

      述詞規格距離採用兩個參數作為輸入,並將結果與 T2.C2,類型為 INTEGER。 因為只有右側表示式的資料類型才重要 (而不是使用特定常數) ,所以最好在 CREATE FUNCTION DDL 中選擇 EXPRESSION 子句,以指定萬用字元作為比較值。

      或者,下列陳述式也是有效的使用者定義述詞:
         SELECT T1.C1
           FROM T1, T2
           WHERE distance(T1.P1, T2.P1) > distance (T1.P2, T2.P2)
      目前有一項限制,即只將右側視為表示式; 左側的術語是使用者定義述詞的使用者定義函數。
    • SEARCH BY INDEX EXTENSION 子句指出索引延伸和搜尋目標的組合可用於此使用者定義述詞。 在距離函數的情況下,識別為 distExpr 的表示式也是傳遞至範圍生產者函數 (定義為索引延伸的一部分) 的其中一個搜尋引數。 表示式 ID 用來定義表示式的名稱,以便將它作為引數傳遞至 range-producer 函數。