CREATE FUNCTION(外部表格)

此 CREATE FUNCTION (外部表格) 陳述式會在現行伺服器上定義外部表格函數。 此函數會傳回結果表格。

外部使用者定義的 表格函數 可以在次選取的 FROM 子句中使用,並透過在每次呼叫時傳回一列,將表格傳回至次選取。

呼叫

此陳述式可以內嵌在應用程式中,或以互動方式發出。 它是可動態準備的可執行陳述式。

授權

陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:

  • 若為 SYSFUNCS 型錄視圖及 SYSPARMS 型錄表格:
    • 表格的 INSERT 專用權,以及
    • 綱目 QSYS2 的 USAGE 專用權
  • 資料庫管理者權限

如果外部程式或服務程式存在,則陳述式的授權 ID 所保留的專用權必須至少包括下列其中一項:

  • 對於 SQL 陳述式中所參照的外部程式或服務程式:
    • 包含外部程式或服務程式之綱目的 USAGE 專用權。
    • 外部程式或服務程式的系統權限 *EXECUTE ,以及
    • 程式或服務程式的系統權限 *CHANGE。 系統需要此權限來更新程式物件,以包含將功能儲存/還原至另一個系統所需的資訊。 如果使用者沒有此權限,則仍會建立功能,但不會更新程式物件。
  • 資料庫管理者權限

如果已指定 SQL 名稱,且存在與建立函數之檔案庫同名的使用者設定檔,且該名稱與陳述式的授權 ID 不同,則陳述式的授權 ID 所保留的專用權必須至少包括下列其中一項:

  • 具有該名稱之使用者設定檔的系統權限 *ADD
  • 資料庫管理者權限

如果參照特殊類型,則陳述式的授權 ID 所保留的專用權必須至少包括下列其中一項:

  • 對於陳述式中所識別的每一個特殊類型:
    • 特殊類型的 USAGE 專用權,以及
    • 包含特殊類型之綱目的 USAGE 專用權
  • 資料庫管理者權限

若要取代現有函數,陳述式的授權 ID 所保留的專用權必須至少包括下列其中一項:

  • 下列系統權限:
    • 與功能相關的服務程式物件上 *OBJMGT 的系統權限
    • DROP 函數所需的所有權限
    • SYSFUNCS 型錄視圖及 SYSPARMS 型錄表格的系統權限 *READ
  • 資料庫管理者權限

如需對應於 SQL 專用權之系統權限的相關資訊,請參閱 檢查表格或視圖的專用權時對應的系統權限檢查特殊類型的專用權時對應的系統權限

語法

讀取語法圖跳過視覺化語法圖CREATEOR REPLACEFUNCTION函數名稱( ,參數宣告 )RETURNS TABLE (,直欄名稱data-type2AS LOCATOR) 選項清單SET OPTION-陳述式
參數-宣告
讀取語法圖跳過視覺化語法圖 參數名稱 data-type1 AS LOCATORXML 強制轉型類型 預設子句
data-type1, data-type2
讀取語法圖跳過視覺化語法圖內建類型distinct-type-name
XML 強制轉型類型
讀取語法圖跳過視覺化語法圖 CHARACTERCHAR(1)(整數)ccsid 子句CHARACTERCHARVARYINGVARCHAR(整數)ccsid 子句CHARACTERCHARLARGE OBJECTCLOB(1M)(整數KMG)ccsid 子句LOCATORGRAPHIC(1)(整數)ccsid 子句GRAPHIC VARYINGVARGRAPHIC(整數)ccsid 子句DBCLOB(1M)(整數KMG)ccsid 子句LOCATORBINARY(1)(整數)BINARY VARYINGVARBINARY(整數)BLOBBINARY LARGE OBJECT(1M)(整數KMG)LOCATOR
內建類型
讀取語法圖跳過視覺化語法圖SMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)(整數,0,整數)FLOAT(53)(整數)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)(整數)CHARACTERCHARVARYINGVARCHAR(整數)FOR BIT DATAFOR SBCS DATAFOR MIXED DATAccsid 子句CHARACTERCHARLARGE OBJECTCLOB(1M)(整數KMG)FOR SBCS DATAFOR MIXED DATAccsid 子句GRAPHIC(1)(整數)GRAPHIC VARYINGVARGRAPHIC(整數)DBCLOB(1M)(整數KMG)ccsid 子句NATIONAL CHARACTERNATIONAL CHARNCHAR(1)(整數)NATIONAL CHARACTERNATIONAL CHARNCHARVARYINGNVARCHAR(整數)NATIONAL CHARACTERNCHARLARGE OBJECTNCLOB(1M)(整數KMG)正規化子句BINARY(1)(整數)BINARY VARYINGVARBINARY(整數)BLOBBINARY LARGE OBJECT(1M)(整數KMG)DATETIME(0)TIMESTAMP(6)(整數)ROWIDXMLccsid 子句1BOOLEAN
ccsid 子句
讀取語法圖跳過視覺化語法圖CCSID整數正規化子句
normalize-clause
讀取語法圖跳過視覺化語法圖NOT NORMALIZEDNORMALIZED
預設子句
讀取語法圖跳過視覺化語法圖DEFAULT NULL常數特別暫存器廣域變數(表示式search-condition)
附註:
  • 1 XML 的 ccsid-clause 僅適用於 data-type2
選項-清單
讀取語法圖跳過視覺化語法圖LANGUAGECC++CLCOBOLCOBOLLEJAVAPLIRPGRPGLE1PARAMETER STYLE SQLPARAMETER STYLE DB2GENERALSPECIFIC特定名稱NOT DETERMINISTICGLOBALSTATEMENTDETERMINISTICREADS SQL DATANO SQLCONTAINS SQLMODIFIES SQL DATACALLED ON NULL INPUT RETURNS NULL ON NULL INPUT WITHOUT RESTRICT ON DROPWITH RESTRICT ON DROPINCLUDING EXTERNAL PROGRAM INHERIT SPECIAL REGISTERS STATIC DISPATCHNO DBINFO DBINFOEXTERNAL ACTIONNO EXTERNAL ACTIONFENCEDNOT FENCEDPROGRAM TYPE MAINPROGRAM TYPE SUBNO FINAL CALLFINAL CALLALLOW PARALLELDISALLOW PARALLELNO SCRATCHPADSCRATCHPAD100整數EXTERNALEXTERNAL NAME外部程式名稱CARDINALITYBIGINTNOT SECUREDSECURED
附註:
  • 1 此條款及選項清單中的後續條款可以任意順序指定。 每一個子句最多可以指定一次。

說明

或替換
指定如果現行伺服器上存在函數定義,則取代該函數的定義。 在型錄中取代新定義之前,會有效地捨棄現有定義,但不會影響對函數所授與的專用權除外。 如果現行伺服器上不存在函數的定義,則會忽略此選項。 若要取代現有函數,新定義的 specific-namefunction-name 必須與舊定義的 specific-namefunction-name 相同, 或新定義的簽章必須符合舊定義的簽章。 否則,會建立新的函數。
函數名稱
命名使用者定義的函數。 除非指定 OR REPLACE ,否則名稱、綱目名稱、參數數目及每一個參數的資料類型組合 (不考慮資料類型的任何長度、精準度、小數位數或 CCSID 屬性) 不得識別存在於現行伺服器上的使用者定義函數。

對於 SQL 命名,將在隱含或明確限定元指定的綱目中建立函數。

對於系統命名,將在限定元指定的綱目中建立函數。 如果未指定限定元:

  • 如果 CURRENT SCHEMA 特別暫存器的值是 *LIBL ,則會在現行檔案庫 (*CURLIB) 中建立函數。
  • 否則,將在現行綱目中建立函數。

一般而言,如果每一個函數的函數簽章都是唯一的,則多個函數可以具有相同的名稱。

某些功能名稱保留供系統使用。 如需相關資訊,請參閱 CREATE FUNCTION中的「選擇綱目及函數名稱」。

(參數宣告 ...)
指定函數的輸入參數數目及每一個參數的資料類型。 每一個 參數宣告 都會指定函數的輸入參數。

參數數目上限取決於語言類型:

  • 對於 JAVA 和 ILE 程式及服務程式,最大值為 2000。
  • 對於 OPM 程式,上限為 90。

參數數目上限可由語言所容許的參數數目上限進一步限制。

函數可以有零個以上輸入參數。 對於函數預期要接收的每一個參數,清單中必須有一個項目。 函數的所有參數都是輸入參數且可為空值。 在 JAVA 的情況下, DECIMAL 和 NUMERIC 類型以外的數值參數不可為空值。 如果在 CALLED ON NULL INPUT 函數的這類參數中輸入空值,則會發生執行時期錯誤。 如需相關資訊,請參閱 CREATE FUNCTION中的定義參數。
參數名稱
為參數命名。 雖然不需要,但可以指定每一個參數的參數名稱。 此名稱不能與參數清單中任何其他 parameter-name 相同。
data-type1
指定輸入參數的資料類型。 資料類型可以是內建資料類型或特殊類型。 它不能是陣列類型。
內建類型
指定內建資料類型。 如需每一種內建資料類型的更完整說明,請參閱 CREATE TABLE。 並非所有語言都支援部分資料類型。 如需 SQL 資料類型與主語言資料類型之間對映的詳細資料,請參閱 內嵌式 SQL 程式設計 主題集合。 如果內建資料類型規格對應於用來撰寫使用者定義函數的語言,則可以指定它們。
distinct-type-name
指定使用者定義的特殊類型。 參數的長度、精準度或小數位數屬性是特殊類型的來源類型 (在 CREATE TYPE 上指定的那些類型)。 如需建立特殊類型的相關資訊,請參閱 CREATE TYPE (distinct)

如果特殊類型的名稱不完整,資料庫管理程式會在 SQL 路徑中搜尋綱目來解析綱目名稱。

指定 PARAMETER STYLE JAVA 時,不支援具有大型物件 (LOB) 資料類型的參數。

如果指定 CCSID ,則在將參數傳遞給函數之前,會將參數轉換成該 CCSID。 如果未指定 CCSID ,則在呼叫函數時,會由現行伺服器上的預設 CCSID 決定 CCSID。

日期、時間及時間戳記參數會以 ISO 格式的字串傳遞至程序。

任何具有 XML 類型的參數都必須指定 XML-cast-type 子句或 AS LOCATOR 子句。

傳址不傳值
指定輸入參數是值的定位器,而不是實際值。 僅當輸入參數具有 LOB 或 XML 資料類型或基於 LOB 或 XML 資料類型的特殊類型時,才可以指定 AS LOCATOR。 如果指定 AS LOCATOR ,則不得指定 FOR SBCS DATA 或 FOR MIXED DATA。

如需 AS LOCATOR 子句的相關資訊,請參閱 CREATE FUNCTION中針對參數指定 AS LOCATOR。

AS XML-cast-type
針對 XML 類型或以 XML 類型為基礎的特殊類型的參數,指定傳給函數的資料類型。 如果指定 LOCATOR ,則參數是值的定位器,而不是實際值。

如果指定 CCSID 值,則圖形資料類型只能指定 Unicode CCSID 值。 如果未指定 CCSID 值,則會在根據 SQL_XML_DATA_CCSID QAQQINI 選項設定建立函數時建立 CCSID。 預設 CCSID 是 1208。 如需此選項的說明,請參閱 XML 值

預設子句
指定參數的預設值。 預設值可以是常數、特別暫存器、廣域變數、表示式、 變更開始a search-condition變更結束 或關鍵字 NULL。 表示式是 表示式中定義的任何表示式,不包括聚集函數或直欄名稱。 變更開始如果指定 search-condition ,則不得在 EXISTS 或 IN 述詞中包含子查詢。變更結束 如果未指定預設值,則參數沒有預設值,且在呼叫時無法省略。 表示式字串的長度上限為 64K。

預設表示式必須是與參數資料類型相容的指派。

預設表示式中要作為清單中數值常數的分隔字元的任何逗點必須後接空格。

建立函數時,預設表示式中參照的所有物件都必須存在。 當呼叫函數時,會使用呼叫程式的權限來評估預設值。

無法為陣列類型的參數指定預設值。

RETURNS TABLE
指定函數的輸出是表格。 此子句後面的括弧含括結果表格直欄的名稱及資料類型清單。

結果直欄數目上限取決於語言類型。 假設參數數目是 N

  • 對於 JAVA 和 ILE 程式及服務程式,不得超過 8000- N 個直欄。
  • 對於 OPM 程式,不得超過 125- N 個直欄。
直欄名稱
指定輸出表格的直欄名稱。 請勿多次指定相同的名稱。
data-type2
指定直欄的資料類型。 直欄可為空值。

您可以指定任何內建資料類型 (LONG VARCHAR、LONG VARGRAPHIC 或 DataLink除外) 或特殊類型 (非以 DataLink為基礎)。 您無法指定陣列類型。

如果指定 DATE 或 TIME ,則表格函數必須以 ISO 格式傳回日期或時間。

如果指定 CCSID ,

  • 如果未指定 AS LOCATOR ,則會假設傳回的結果以該 CCSID 編碼。
  • 如果指定 AS LOCATOR ,且定位器所指向之資料的 CCSID 是以不同的 CCSID 編碼,則資料會轉換成指定的 CCSID。

如果未指定 CCSID ,

  • 如果未指定 AS LOCATOR ,則會假設傳回的結果以工作的 CCSID (或圖形字串回覆值之工作的相關聯圖形 CCSID) 編碼。
  • 如果指定 AS LOCATOR ,則定位器指向的資料會轉換成工作的 CCSID (如果定位器指向的資料的 CCSID 是以不同的 CCSID 編碼)。 若要避免在轉換期間可能遺失任何字元,請考慮明確指定 CCSID ,以代表將從函數傳回的任何字元。 如果資料類型是圖形字串資料,這尤其重要。 在此情況下,請考慮使用 CCSID 1200 或 13488 (Unicode 圖形字串資料)。
傳址不傳值
指定函數傳回直欄值而非實際值的定位器。 您只能對 LOB 或 XML 資料類型或基於 LOB 或 XML 資料類型的特殊類型指定 AS LOCATOR。 如果指定 AS LOCATOR ,則不得指定 FOR SBCS DATA 或 FOR MIXED DATA。

如需 AS LOCATOR 子句的相關資訊,請參閱 CREATE FUNCTION中針對參數指定 AS LOCATOR。

語言
正文條款指定外部程式的正文。

如果未指定 LANGUAGE ,則會從建立函數時與外部程式相關聯的程式屬性資訊來決定 LANGUAGE。 在下列情況下,會將程式的語言假設為 C:

  • 與程式相關聯的程式屬性資訊無法識別可辨識的語言
  • 找不到程式
C   
外部程式以 C 撰寫。
C++
外部程式以 C++ 撰寫。
cl
外部程式以 CL 或 ILE CL 撰寫。
COBOL
外部程式以 COBOL 撰寫。
COBOLLE
外部程式以 ILE COBOL 撰寫。
JAVA
外部程式以 JAVA 撰寫。 資料庫管理程式會將使用者定義函數當作 Java™ 類別中的方法來呼叫。
PLI
外部程式以 PL/I 撰寫。
RPG
外部程式以 RPG 撰寫。
RPGLE
外部程式以 ILE RPG 撰寫。
參數樣式
指定用於將參數傳遞至函數並從函數傳回值的慣例:
DB2GENERAL
此參數樣式用來指定將參數傳遞至 Java 類別中定義為方法的外部函數,以及從定義為方法的外部函數傳回值的慣例。 會傳遞所有適用的參數。 參數定義為依下列順序:
  • 前 N 個參數是在 CREATE FUNCTION 陳述式上指定的輸入參數。
  • 下一個 M 參數是 RETURNS TABLE 子句上所指定函數的結果直欄。

只有在 LANGUAGE 是 JAVA 時,才容許 DB2GENERAL 。

SQL
會傳遞所有適用的參數。 參數定義為依下列順序:
  • 前 N 個參數是在 CREATE FUNCTION 陳述式上指定的輸入參數。
  • 下一個 M 參數是 RETURNS TABLE 子句上所指定函數的結果直欄。
  • 輸入參數的指示器變數的 N 個參數。
  • 在 RETURNS TABLE 子句上指定之函數結果直欄的指示器變數的 M 參數
  • SQLSTATE 的 CHAR (5) 輸出參數。 傳回的 SQLSTATE 指出函數成功或失敗。 傳回的 SQLSTATE 為:
    • 來自在外部程式中執行的最後一個 SQL 陳述式的 SQLSTATE ,
    • 由外部程式指派的 SQLSTATE。

      使用者可以將 SQLSTATE 設為外部程式中的任何有效值,以從函數傳回錯誤或警告。

  • 完整函數名稱的 VARCHAR (517) 輸入參數。
  • 特定名稱的 VARCHAR (128) 輸入參數。
  • 訊息文字的 VARCHAR (1000) 輸出參數。
  • 如果在 CREATE FUNCTION 陳述式上指定 SCRATCHPAD ,則為 scratchpad 的結構 (由 INTEGER 後接 CHAR (n)) 輸入及輸出參數。
  • 呼叫類型的 INTEGER 輸入參數。
  • dbinfo 結構的結構 (如果已在 CREATE FUNCTION 陳述式上指定 DBINFO)。
根據指定的 LANGUAGE 來傳遞這些參數。 例如,如果語言是 C 或 C++ ,則 VARCHAR 參數會以 NUL 終止的字串來傳遞。 如需所傳遞參數的相關資訊,請參閱檔案庫 QSYSINC 中適當原始檔內的併入 sqludf 。 例如,對於 C ,可以在 QSYSINC/H 中找到 sqludf。

請注意,外部函數的語言會決定如何傳遞參數。 例如,在 C 中,任何 VARCHAR 或 CHAR 參數都會以 NUL 終止的字串來傳遞。 如需相關資訊,請參閱 SQL 程式設計 主題集合。 若為 Java 常式,請參閱 IBM® Developer Kit for Java 主題集合。

SPECIFIC specific-name
指定函數的唯一名稱。 如需特定名稱的相關資訊,請參閱 CREATE FUNCTION中指定函數的特定名稱。
GLOBAL DETERMINISTIC STATEMENT DETERMINISTIC NOT DETERMINISTIC
指定每次使用相同的輸入引數來呼叫函數時,函數是否都傳回相同結果。 預設值是 NOT DETERMINISTIC。
不確定
指定每次使用相同的輸入引數呼叫函數時,函數可能不會傳回相同的結果。 此函數取決於影響結果的部分狀態值。 在 SQL 陳述式最佳化期間,資料庫管理程式會使用此資訊。 非確定性表格函數的範例是參照特別暫存器、非確定性函數或影響表格函數結果表格的順序。
全球確定性
指定每次使用相同的輸入引數呼叫函數時,函數一律傳回相同的結果表格。 在 SQL 陳述式最佳化期間,資料庫管理程式會使用此資訊。 查詢最佳化工具可以選擇快取廣域確定性函數結果。
陳述式確定性
指定每次使用相同的輸入引數呼叫函數時,函數可能不會傳回相同的結果,但會將單一 SQL 陳述式內的函數多次呼叫視為唯一性。 查詢最佳化工具將不會快取陳述式確定性函數結果。1
CONTAINS SQL , READS SQL DATA ,修改 SQL DATA , NO SQL
指定函數可執行之 SQL 陳述式 及巢狀常式 的分類。 資料庫管理程式會驗證函數發出的 SQL 陳述式 及函數本端呼叫的所有常式 與此規格一致。 當呼叫巢狀遠端常式時,不會執行驗證。 如需每一個陳述式的分類,請參閱 SQL 陳述式性質預設值為 READS SQL DATA。 參數預設表示式會忽略此選項。
READS SQL DATA
指定函數可以執行具有 READS SQL DATA、CONTAINS SQL 或 NO SQL 資料存取分類的陳述式。 函數無法執行修改資料的 SQL 陳述式。
沒有 SQL
指定函數只能執行資料存取分類為 NO SQL 的 SQL 陳述式。
CONTAINS SQL
指定函數只能執行資料存取分類為 CONTAINS SQL 或 NO SQL 的 SQL 陳述式。 此函數無法執行任何讀取或修改資料的 SQL 陳述式。
MODIFIES SQL DATA
此函數可以執行任何 SQL 陳述式,但那些在任何函數中不受支援的陳述式除外。
在空值輸入上傳回空值 在空值輸入上呼叫
指定在執行時間若有任何輸入引數為空值時是否呼叫函數。 CALLED ON NULL INPUT 是預設值。
在空值輸入時傳回空值
指定如果任何輸入引數是空值,則不呼叫函數。 結果是空表格,它是沒有列的表格。
輸入空值時呼叫
指定如果任何引數值是空值,則要呼叫函數。 此規格表示必須對函數進行編碼,以測試空值引數值。 此函數可以傳回空表格,視其邏輯而定。
變更開始WITHOUT RESTRICT ON DROP WITH RESTRICT ON DROP WITH RESTRICT ON DROP INCLUDING EXTERNAL PROGRAM變更結束
變更開始指定是否可以捨棄函數。 預設值是 WITHOUT RESTRICT ON DROP。
WITHOUT RESTRICT ON DROP
指定可以捨棄函數。
捨棄時施加限制
指定在移除此屬性之前無法捨棄函數。
WITH RESTRICT ON DROP INCLUDING EXTERNAL PROGRAM
指定在移除此屬性之前無法捨棄函數。
此外,無法刪除與功能相關的程式或服務程式。
只有在相關程式或服務程式物件中儲存屬性時,才會施行 INCLUDING EXTERNAL PROGRAM 子句。 如需儲存屬性的詳細資料,請參閱建立函數。
如果一個以上常式與程式或服務程式相關聯,則如果任何常式包括 INCLUDING EXTERNAL PROGRAM 子句,則無法刪除程式或服務程式。
變更結束
繼承特別暫存器
指定在進入函數時繼承特別暫存器的現有值。
靜態分派
指定靜態分派函數。 所有函數都會靜態分派。
NO DBINFO DBINFO
指定在呼叫函數時,是否傳遞其他狀態資訊。 預設值為 NO DBINFO。
無 DBINFO
指定不傳遞其他資訊。
DBINFO
指定資料庫管理程式應該將包含狀態資訊的結構傳遞給函數。 表 1 包含 DBINFO 結構的說明。 您可以在檔案庫 QSYSINC 中適當來源檔的 sqludf 中找到 DBINFO 結構的詳細資訊。 例如,對於 C ,可以在 QSYSINC/H 中找到 sqludf。
表 1. DBINFO 欄位
欄位 資料類型 說明
關聯式資料庫 VARCHAR (128) 現行伺服器的名稱。
授權 ID VARCHAR (128) 執行時期授權 ID。
CCSID 資訊
INTEGER
INTEGER
INTEGER
 
INTEGER
INTEGER
INTEGER
 
INTEGER
INTEGER
INTEGER
 
INTEGER
 
CHAR(8)
工作的 CCSID 資訊。 會傳回三組三個 CCSID。 下列資訊會識別每一個集合中的三個 CCSID:
  • SBCS CCSID
  • DBCS CCSID
  • 混合 CCSID
在三組 CCSID 之後是一個整數,指出三組 CCSID 的哪一組適用,以及保留空間的八個位元組。

每一組 CCSID 都適用於不同的編碼方法 (EBCDIC、ASCII 及 Unicode)。

如果未在 CREATE FUNCTION 陳述式上明確指定參數的 CCSID ,則在執行函數時,會假設輸入字串以工作的 CCSID 編碼。 如果輸入字串的 CCSID 與參數的 CCSID 不同,則在呼叫外部程式之前,會先轉換傳給外部函數的輸入字串。

目標直欄 VARCHAR (128)
VARCHAR (128)
VARCHAR (128)
如果在 UPDATE 陳述式中 SET 子句右側指定使用者定義函數,則下列資訊會識別目標直欄:
  • 綱目名稱
  • 基本表格名稱
  • 直欄名稱
如果使用者定義函數不在 UPDATE 陳述式中 SET 子句的右側,則這些欄位會空白。
版本和版次 CHAR(8) 資料庫管理程式的版本、版次及修正層次。
平台 INTEGER 伺服器的平台類型。
表格函數直欄清單項目的數目 SMALLINT 在下面「表格函數直欄清單」欄位中指定的表格函數直欄清單中,非零項目的數目。
保留 CHAR (24) 保留,供未來使用。
表格函數直欄清單 指標 (16 位元組) 此欄位是短整數陣列的指標,由資料庫管理程式動態配置。 只有前 n 個項目 (其中 n 指定在「表格函數直欄清單項目數目」欄位中) 感興趣, n 可以等於 0 ,且小於或等於在 RETURNS TABLE 子句中為函數定義的結果直欄數目。 這些值對應於此陳述式從表格函數中需要的直欄序數。 值 1 表示第一個定義的結果直欄, 2 表示第二個定義的結果直欄,依此類推。 值可以任何順序。 請注意,對於類似於 SELECT COUNT (*) FROM TABLE (TF (...)) AS QQ 的陳述式, n 可能等於零,其中查詢不需要實際直欄值。

此陣列代表最佳化的機會。 此函數不需要針對表格函數的所有結果直欄傳回所有值。 在特定環境定義中可能只需要值的子集,這些是陣列中所識別的直欄 (依數字)。 因為此最佳化可能會使函數邏輯複雜化,所以函數可以選擇傳回每一個已定義的直欄。

外部動作 沒有外部動作
指定函數是否採取動作,以變更資料庫管理程式未管理之物件的狀態。 外部動作的範例是傳送訊息或將記錄寫入串流檔。 預設值為 EXTERNAL ACTION。
外部動作
指定函數可以採取動作來變更資料庫管理程式未管理之物件的狀態。 因此,必須使用每一個連續函數呼叫來呼叫函數。 如果函數包含參照另一個具有外部動作的常式,則應該指定 EXTERNAL ACTION。
NO EXTERNAL ACTION
此功能不會執行外部動作。 每一個連續函數呼叫都不需要呼叫它。

沒有任何外部動作函數的執行效能可能優於外部動作函數,因為每一個後續函數呼叫可能不會呼叫它們。

FENCED NOT FENCED
指定外部函數是否在與資料庫管理程式環境不同的環境中執行。 FENCED 是預設值。
隔離
此函數將在個別執行緒中執行。

FENCED 函數無法在對函數的個別呼叫中保持開啟 SQL 游標。 然而,一個執行緒中的游標與任何其他執行緒中的游標無關,這會減少游標名稱衝突的可能性。

NOT FENCED
函數可以在與呼叫 SQL 陳述式相同的執行緒中執行。

NOT FENCED 函數可以在對函數的個別呼叫之間保持開啟 SQL 游標。 因為游標可以保持開啟,所以在呼叫函數之間也會保留游標位置。 不過,游標名稱可能會衝突,因為 UDF 現在正在與呼叫 SQL 陳述式及其他 NOT FENCED UDF 相同的執行緒中執行。

NOT FENCED 函數的執行效能通常比 FENCED 函數好。

PROGRAM TYPE MAIN PROGRAM TYPE SUB
為了與其他產品相容,容許此參數。 它指出常式的外部程式是程式 (*PGM) 還是服務程式 (*SRVPGM) 中的程序。
PROGRAM TYPE MAIN
指定常式作為程式中的主要進入點執行。 外部程式必須是 *PGM 物件。
程式類型子項
指定常式作為服務程式中的程序來執行。 外部程式必須是 *SRVPGM 物件。
無最終呼叫 最終呼叫
指定是否對函數進行個別 第一次呼叫最終呼叫 。 為了區分呼叫類型,函數會收到指定呼叫類型的其他引數。 對於表格函數,一律會出現 call-type 引數 (不論 FINAL CALL 或 NO FINAL CALL 是否有效) ,它會指出第一次呼叫、開啟呼叫、提取呼叫、關閉呼叫或最終呼叫。

使用 NO FINAL CALL 時,資料庫管理程式只會對表格函數進行三種類型的呼叫: 開啟、提取及關閉。 不過,如果指定 FINAL CALL ,則除了開啟、提取及關閉之外,還可以對表格函數進行第一次呼叫及最終呼叫。

最終呼叫可讓函數釋放它所獲得的任何系統資源。 當已使用 SCRATCHPAD 關鍵字定義函數,且該函數獲得系統資源並將它們儲存在即時運算簿中時,最終呼叫非常有用。 預設值為 NO FINAL CALL。

無最終呼叫
指定不對函數進行個別的第一個和最後一個呼叫。 不過,仍會對函數進行 open、fetch 及 close 呼叫,且表格函數一律會收到指定呼叫類型的其他引數。
最終呼叫
指定對函數進行個別的第一個和最後一個呼叫。 它也會控制何時重新起始設定立即運算簿。

呼叫類型如下:

第一次呼叫
指定此 SQL 陳述式中函數之此參照的第一次呼叫。
開啟通話
指定在此 SQL 陳述式中開啟表格函數結果的呼叫。
提取呼叫
指定呼叫以從這個 SQL 陳述式中的表格函數提取列。
關閉通話
指定呼叫以關閉此 SQL 陳述式中的表格函數結果。
最終呼叫
指定函數的前次呼叫,以讓函數釋放資源。 如果發生錯誤,資料庫管理程式會嘗試進行最終呼叫。

在下列時間進行最終呼叫:

  • 陳述式結尾: 針對游標導向陳述式關閉游標時,或陳述式執行已完成。
  • 交易結束: 當未發生陳述式正常結束處理時。 例如,由於某些原因,應用程式的邏輯會略過關閉游標。

如果在定義為 WITH HOLD 的游標開啟時發生確定作業,則會在游標關閉或應用程式結束時進行最終呼叫。

在 FINAL CALL 期間不應執行可確定的作業,因為 FINAL CALL 可能在作為 COMMIT 作業的一部分所呼叫的關閉期間發生。

ALLOW PARALLEL DISALLOW PARALLEL
指定是否可以平行執行函數。

如果指定下列一或多個子句,則預設值為 DISALLOW PARALLEL: NOT DETERMINISTIC、EXTERNAL ACTION、Final Call、MODIFIES SQL DATA 或 SCRATCHPAD。 否則, ALLOW PARALLEL 是預設值。

容許平行
指定資料庫管理程式可以考量函數的平行化。 資料庫管理程式不需要在呼叫函數的 SQL 陳述式上或在從函數內發出的任何 SQL 陳述式上使用平行化。

如需適用於 ALLOW PARALLEL 規格的考量,請參閱 NOT DETERMINISTIC、EXTERNAL ACTION、MODIFIES SQL DATA、SCRATCHPAD 及 FINAL CALL 的說明。

不允許平行
指定資料庫管理程式不得對函數使用平行化。
無 SCRATCHPAD SCRATCHPAD
指定函數是否需要靜態記憶體區域。
無 SCRATCHPAD
指定函數不需要持續性記憶體區域。
SCRATCHPAD 整數
指定函數需要長度為整數的持續性記憶體區域。 整數範圍可以從 1 到 16,000,000。 如果未指定記憶體區域,則區域大小為 100 個位元組。 如果指定參數樣式 SQL ,則會在指向靜態儲存區的必要參數之後傳遞指標。 只會為函數配置 1 個記憶體區域。
Scratchpad 的範圍是 SQL 陳述式。 對於 SQL 陳述式中函數的每一個參照,都有一個立即運算簿。 例如,假設使用 SCRATCHPAD 關鍵字定義函數 UDFX ,則會在下列 SQL 陳述式中為 UDFX 的兩個參照配置兩個立即運算簿:
SELECT A.C1, B.C1 
  FROM TABLE(UDFX(:hv1)) AS A, TABLE(UDFX(:hv1)) AS B  
EXTERNAL
指定使用 CREATE FUNCTION 陳述式,以根據以外部程式設計語言撰寫的程式碼來定義新的函數。

如果未指定 external-program-name ,則會假設外部程式名稱與函數名稱相同。

名稱 external-program-name
指定在 SQL 陳述式中呼叫函數時將執行的程式、服務程式或 Java 類別。 名稱必須識別在呼叫函數時存在於應用程式伺服器上的程式、服務程式或 Java 類別。 如果命名選項是 *SYS 且名稱不完整:
  • 在呼叫函數時,將使用現行路徑來搜尋程式。
  • 在對函數執行 COMMENT、GRANT、LABEL 或 REVOKE 作業時,將使用 *LIBL 來搜尋程式或服務程式。

應用程式伺服器會檢查名稱的有效性。 如果名稱的格式不正確,則會傳回錯誤。

程式、服務程式或 Java 類別在建立函數時不需要存在,但在呼叫函數時必須存在。

在函數的外部程式中不容許 CONNECT、SET CONNECTION、RELEASE、DISCONNECT、COMMIT、ROLLBACK 及 SET TRANSACTION 陳述式。

基數 bigint
指定函數傳回的預期列數估計值,以供資料庫管理程式在最佳化期間使用。 bigint 必須在 0 到 9 223 372 036 854 775 807 (含) 的範圍內。 如果未指定 CARDINALITY ,則資料庫管理程式會假設有限值。

每次呼叫都會傳回一列,且永不傳回表格結尾條件的表格函數具有無限基數。 呼叫此類函數且需要最終表格結尾條件才能傳回任何資料的查詢將不會傳回,除非岔斷。 在涉及 DISTINCT、GROUP BY 或 ORDER BY 的查詢中,不應使用永不傳回表格結尾條件的表格函數。

非安全 安全
指定針對橫列存取控制及直欄存取控制是否將功能視為安全。
不安全
指定針對橫列存取控制及直欄存取控制,將功能視為不安全。 這是預設值。
當呼叫函數時,當表格使用作用中直欄存取控制時,函數的引數不得參照已啟用直欄遮罩的直欄。
安全
指定針對橫列存取控制和直欄存取控制,將功能視為安全。 此選項可用於以 C、C++、ILE RPG、ILE COBOL、ILE CL 或 Java 撰寫的外部函數。 執行 CREATE FUNCTION 陳述式時,程式或服務程式必須存在。
當在橫列許可權或直欄遮罩中參照函數時,必須將它定義為安全。
SET OPTION-陳述式
指定將使用參數預設值的選項。 選項的預設值取決於建立時作用的選項。 如需相關資訊,請參閱 SET OPTION

處理預設值表示式時使用下列選項 :ALWCPYCTA、CONACC、DATFMT、DATSEP、DECFLTRND、DECMPT、DECFRESULT、DFTRDBCOL、LANGID、SQLCURRULE、SQLPATH、SRTSEQ、TGTRLS、TIMFMT 及 TIMSEP。 CREATE FUNCTION 陳述式中不容許選項 CNULRQD、CNULIGN、COMPILEOPT、EXTIND、NAMING 及 SQLCA。 接受其他選項,但將忽略。

附註

定義使用者定義函數的一般考量: 如需定義使用者定義函數的一般資訊,請參閱 CREATE FUNCTION

REPLACE 規則: 當 REPLACE 重建外部函數時:
  • 會捨棄任何現有的註解或標籤。
  • 如果指定不同的外部程式:
    • 授權使用者不會複製到新程式。
    • 異動日誌審核未變更。
  • 否則:
    • 已維護授權使用者。 物件擁有者不會變更。
    • 現行異動日誌審核未變更。

建立函數: 建立與 ILE 外部程式或服務程式相關聯的外部函數時,會嘗試將函數的屬性儲存在相關聯的程式或服務程式物件中。 如果儲存 *PGM 或 *SRVPGM 物件,然後還原至此系統或其他系統,則會使用屬性來更新型錄。

可以儲存外部函數的屬性,但有下列限制:

  • 外部程式庫不能是 SYSIBM、QSYS 或 QSYS2。
  • 發出 CREATE FUNCTION 陳述式時,外部程式必須存在。

    如果指定系統命名,且外部程式名稱不完整,則必須在檔案庫清單中找到外部程式。

  • 外部程式必須是 ILE *PGM 或 *SRVPGM 物件。

如果無法更新物件,仍會建立函數。

如果在 QTEMP 中建立外部功能,則工作結束時不會移除型錄資訊。

呼叫函數: 當呼叫外部函數時,它會在建立外部程式或服務程式時指定的任何啟動群組中執行。 不過,通常應該使用 ACTGRP (*CALLER) ,以便函數在與呼叫程式相同的啟動群組中執行。 不容許 ACTGRP (*NEW)。

LANGUAGE JAVA 函數一律在預設啟動群組 (*DFTACTGRP) 中執行。 撰寫 MODIFIES SQL DATA Java 函數時應注意。 因為 Java 功能所執行的變更是在預設啟動群組中執行,所以如果呼叫程式在新的啟動群組 (*NEW) 中執行,則可能會發生異動問題。

EXTERNAL ACTION 函數: 在包含其他表格參照的查詢中呼叫 EXTERNAL ACTION 表格函數時,呼叫相對於結合或搜尋條件的應用程式的表格函數可能無法預期。 相對於查詢中的其他處理程序,呼叫函數的次數及呼叫函數的順序可能會根據使用的存取計劃而有所不同。

Java 函數的 Notes: 若要能夠執行 Java 函數,請執行下列動作: 您必須在系統上安裝 IBM IBM Developer Kit for Java (5770-JV1)。 否則會傳回 SQLCODE -443 ,並將 CPDB521 訊息放置在工作日誌中。

如果在執行 Java 函數時發生錯誤,則會傳回 SQLCODE -443。 視錯誤而定,其他訊息可能存在於執行功能之工作的工作日誌中。

替代語法: 下列關鍵字是支援與舊版相容的同義字。 這些關鍵字非標準且不應使用:

  • 關鍵字 VARIANT 和 NOT VARIANT 可以作為 NOT DETERMINISTIC 和 DETERMINISTIC 的同義字。
  • 關鍵字 NULL CALL 和 NOT NULL CALL 可以作為 CALLED ON NULL INPUT 和 RETURNS NULL ON NULL ON NULL INPUT 的同義字。
  • 值 DB2GENRL 可以用作 DB2GENERAL的同義字。
  • PARAMETER STYLE 子句中的關鍵字 PARAMETER STYLE 是選用項目。
  • 關鍵字 IS DETERMINISTIC 可用作 DETERMINISTIC 的同義字。
  • 關鍵字 PARAMETER STYLE $TAG1 DB2SQL $TAG2 可以用作 PARAMETER STYLE SQL 的同義字。

範例

下列會建立寫入的表格函數,以傳回由文字管理系統中每一個已知文件的單一文件 ID 直欄所組成的列。 第一個參數符合給定的主旨區域,第二個參數包含給定的字串。

在單一階段作業的環境定義內, UDF 一律會傳回相同的表格,因此它定義為 DETERMINISTIC。 請注意 RETURNS 子句,其定義來自 DOCmatch 的輸出。 必須對每一個表格函數指定 FINAL CALL。 雖然 DOCMATCH 的輸出大小高度可變,但 CARDINALITY 20 是代表值,且指定為協助最佳化工具。

CREATE FUNCTION DOCMATCH (VARCHAR(30), VARCHAR(255))
  RETURNS TABLE (DOCID CHAR(16))
  EXTERNAL NAME 'MYLIB/RAJIV(UDFMATCH)'
  LANGUAGE C
  PARAMETER STYLE SQL
  NO SQL
  DETERMINISTIC
  NO EXTERNAL ACTION
  NOT FENCED
  SCRATCHPAD
  FINAL CALL
  DISALLOW PARALLEL
  CARDINALITY 20
1 DETERMINISTIC_UDF_SCOPE QAQINI 選項可用來取得 GLOBAL DETERMINISTIC 函數的此相同行為。 如需相關資訊,請參閱 資料庫效能及查詢最佳化 主題集合。