函數解析 (function resolution)

函數由函數名稱呼叫,函數名稱隱含或明確地以綱目名稱來限定,後面接著含括函數引數的括弧。

在資料庫內,每一個函數由其函數簽章 (即其綱目名稱、函數名稱、參數數目及參數的資料類型) 唯一識別。 因此,綱目可以包含數個具有相同名稱的函數,但每一個都具有不同數目的參數,或具有不同資料類型的參數。 或者,具有相同名稱、參數數目及參數類型的函數可以存在於多個綱目中。

  • 超載函數: 在相同綱目中有多個函數實例具有相同參數數目的函數名稱稱為超載函數。
  • 置換函數: 在 SQL 路徑的綱目中可以置換函數,在此情況下, SQL 路徑的不同綱目中有多個函數具有相同名稱及相同參數數目。 這些函數不一定具有不同的參數資料類型。

當呼叫任何函數時,資料庫管理程式必須決定要執行的函數。 此處理程序稱為 函數解析

決定候選函數集:

  • 讓 A 是函數呼叫中的引數數目。
  • 讓 P 是函數簽章中的參數數目。
  • 讓 N 是函數簽章中沒有已定義預設值的參數數目。

根據下列準則來選取用於解析函數呼叫的候選函數:

  • 每一個候選函數都有相符的名稱及適用的參數數目。 適用的參數數目滿足條件 N ≤ A ≤ P。
  • 在函數呼叫中沒有對應引數 (由位置或名稱指定) 的候選函數的每一個參數都定義為預設值。
  • 一組一或多個綱目中的每一個候選函數都具有與呼叫函數之陳述式的授權 ID 相關聯的 EXECUTE 專用權。

對於使用完整或不完整函數名稱呼叫的函數,函數解析類似,但對於不完整名稱,資料庫管理程式需要搜尋多個綱目。

  • 完整函數解析: 以函數名稱和綱目名稱來呼叫函數時,資料庫管理程式只會在指定的綱目中搜尋候選函數。

    如果在綱目中找不到任何候選函數,則會傳回錯誤。 如果選取函數,則其成功使用取決於在容許傳回結果的環境定義中呼叫該函數。 例如,如果函數傳回需要字元資料類型的整數資料類型,或傳回不容許表格的表格,則會傳回錯誤。

  • 不完整的函數解析: 僅使用函數名稱呼叫函數時,資料庫管理程式需要搜尋多個綱目才能解析要執行的函數實例。 SQL 路徑包含要搜尋的綱目清單。 對於 SQL 路徑中的每一個綱目 (請參閱 SQL 路徑) ,資料庫管理程式會選取候選函數。

    如果在路徑中的任何綱目中找不到候選函數,則會傳回錯誤。 如果選取函數,則其成功使用取決於在容許傳回結果的環境定義中呼叫該函數。 例如,如果函數傳回需要字元資料類型的整數資料類型,或傳回不容許表格的表格,則會傳回錯誤。

在資料庫管理程式識別候選函數之後,它會選取具有最佳適合度的候選項作為要執行的函數實例 (請參閱 判定最佳適合度)。 如果多個綱目包含最適合的函數實例 (除了綱目名稱之外,函數簽章是相同的) ,則資料庫管理程式會選取其綱目在 SQL 路徑中最早的函數。

函數解析適用於所有函數,包括內建函數。 內建函數邏輯存在於綱目 QSYS2中。 如果未在 SQL 路徑中明確指定綱目 QSYS2 ,則會在路徑結尾隱含地假設該綱目。 當指定不完整的函數名稱時, SQL 路徑必須以想要的搜尋順序設為綱目清單,以便選取想要的函數。

在 CREATE VIEW 或 CREATE TABLE 陳述式中,建立視圖或具體化查詢表格時,會發生函數解析。 如果隨後建立具有相同名稱的另一個函數,則不會影響視圖或具體化查詢表格,即使新函數比建立視圖或具體化表格時所選擇的函數更適合,也是如此。 在 CREATE FUNCTION、CREATE PROCEDURE、CREATE TRIGGER、CREATE VARIABLE、CREATE MASK 或 CREATE PERPERMISSION 陳述式中,會在建立函數、程序、觸發程式、變數、遮罩或許可權時進行函數解析。 所選函數的綱目會儲存在觸發程式、變數、遮罩及許可權中。 它也會儲存在預設表示式的函數和程序中。 如果隨後建立另一個同名函數,則只有在新函數比建立物件時所選擇的函數更適合時,才會影響函數、程序、觸發程式、變數、遮罩、許可權或常式預設值。