2.20 関数呼出し

<この節の構成>
(1) 機能
(2) 形式
(3) オペランド
(4) 共通規則
(5) 留意事項
(6) 呼び出す関数の決定規則と結果のデータ型

(1) 機能

指定した関数を呼び出します。

(2) 形式

 関数呼出し::=〔認可識別子.〕ルーチン識別子(〔引数〔,引数〕…〕)
 引数::=値式 〔AS データ型〕

(3) オペランド

呼び出す関数の認可識別子を指定します。

パブリック関数を呼び出す場合は,認可識別子にPUBLICを指定します。

呼び出す関数のルーチン識別子を指定します。

値式
呼び出す関数のパラメタに対する値式を指定します。
AS データ型
呼び出す関数のパラメタに対する?パラメタ,又は埋込み変数の既定義型を指定します。

(4) 共通規則

  1. 引数は,指定した順序でパラメタと対応します。
  2. 引数のデータ型は,対応するパラメタのデータ型と互換性がなければなりません。互換性があるデータ型については,「1.2.2 変換(代入,比較)できるデータ型」を参照してください。ただし,次の組み合わせの場合は互換性がありません。
    • 文字集合が異なる文字データ
    • 文字データと混在文字データ
    • 日間隔データと日間隔を10進数で表現した定数
    • 日間隔データとDECIMAL(8,0)に対応する埋込み変数
    • 時間隔データと時間隔を10進数で表現した定数
    • 時間隔データとDECIMAL(6,0)に対応する埋込み変数
    • 日付データと日付を文字列で表現した定数
    • 日付データとCHAR(10)に対応する埋込み変数
    • 日付データと文字集合がUTF16のCHAR(20)に対応する埋込み変数
    • 日付データと,長さが10バイト以上のCHAR,又はVARCHARの埋込み変数
    • 日付データと,長さが20バイト以上で長さが2の倍数のCHAR,又はVARCHARの文字集合がUTF16の埋込み変数
    • 時刻データと時刻を文字列で表現した定数
    • 時刻データとDECIMAL(6,0)に対応する埋込み変数
    • 時刻データと,長さが8バイト以上のCHAR,又はVARCHARの埋込み変数
    • 時刻データと,長さが16バイト以上で長さが2の倍数のCHAR,又はVARCHARの文字集合がUTF16の埋込み変数
    • 時刻印データと時刻印を文字列で表現した定数
    • 時刻印データの小数秒精度が0の場合は19バイト以上,2以上の場合は22バイト以上のCHAR又はVARCHARの埋込み変数
    • 時刻印データの小数秒精度が0の場合は38バイト以上で長さが2の倍数,2以上の場合は44バイト以上で長さが2の倍数のCHAR又はVARCHARの文字集合がUTF16の埋込み変数
    • BINARY型と16進文字列定数
    さらに,引数のデータ型はパラメタのデータ型と優先度が同じか,又はより優先度が高いデータ型でなければなりません。データ型の優先度については,「表2-104 既定義型の優先度」及び「表2-105 抽象データ型の優先度」を参照してください。
  3. 値式に?パラメタ又は埋込み変数だけを指定する場合は,AS データ型を必ず指定して,値式のデータ型を決定してください。
  4. AS データ型を指定した場合,値式には?パラメタ又は埋込み変数以外は指定できません。
  5. 値式に?パラメタ,又は埋込み変数を用いた単項演算は指定できません。
  6. 引数に繰返し列を指定した場合,添字を指定してください。ただし,添字としてANYは指定できません。
  7. 値式に?パラメタ,埋込み変数だけを指定した場合,その?パラメタ,埋込み変数は単純構造にしてください。
  8. 関数呼出しのネスト数は,最大255です。関数呼出しのネスト数は,"ルーチン識別子("の括弧のネスト数です。
  9. 引数には,結果のデータ型がBLOB,又は最大長が32,001バイト以上のBINARY型となるスカラ関数SUBSTRを,単独の値式として指定できません。
  10. ウィンドウ関数は指定できません。

(5) 留意事項

  1. 認可識別子を省略した場合の仮定値については,「1.1.9 スキーマパス」を参照してください。

(6) 呼び出す関数の決定規則と結果のデータ型

  1. 認可識別子,ルーチン識別子,引数の数が一致し,引数のデータ型に抽象データ型を含まないで,かつ引数の順序に対応してパラメタのデータ型が完全一致する場合は,この関数を呼び出します。また,この場合の関数の結果のデータ型は,呼び出す関数のRETURNS句のデータ型になります。
  2. 認可識別子,ルーチン識別子,引数の数のどれかが一致しない関数の場合は,この関数は呼び出しの対象とはなりません。
  3. 呼び出す関数の決定規則を,次の表に示します。

    表2-103 関数呼出しの指定内容と,呼び出す関数の決定規則

    関数呼出しの指定内容呼び出す関数の決定規則
    認可識別子,ルーチン識別子,引数の数が一致する引数の数が0認可識別子,ルーチン識別子,引数のデータ型が一致する関数を呼び出す
    引数に抽象データ型を含まない引数の順序に対応したパラメタのデータ型が完全に一致
    引数の順序に対応したパラメタのデータ型が一致しない下記の「・抽象データ型を含まない場合」の決定規則に従う
    引数に抽象データ型を含む下記の「・抽象データ型を含む場合」の決定規則に従う
    認可識別子,ルーチン識別子,引数の数が一致しない呼び出し可能な関数が存在しないため,SQL文解析時にエラーとなる
    注※
    引数のデータ型が文字列型の場合,「データ型が一致する」とは,文字集合も一致することをいいます。
    • 抽象データ型を含まない場合
      左側の引数から順番に各引数の既定義型を基準として,基準と優先度が同じか又はより優先度が低いデータ型の中で最も優先度の高い既定義型をパラメタに持つ関数を呼び出します。既定義型の優先度を次の表に示します。また,この場合,呼び出す関数がSQL解析時に一意に決まるので,関数の結果のデータ型は呼び出す関数のRETURNS句のデータ型となります。

      表2-104 既定義型の優先度

      各引数のデータ型優先度
      数データSMALLINT→INTEGER→DECIMAL→SMALLFLT→FLOAT
      文字データCHAR→VARCHAR
      各国文字データNCHAR→NVARCHAR
      混在文字データMCHAR→MVARCHAR
      長大データ,及びバイナリデータBINARY→BLOB
    (凡例)
    A→B:AがBより優先度が高いことを示します。
    • 抽象データ型を含む場合
      抽象データ型を含む場合,次の順番で呼び出す関数を決定します。
  4. 基本となる関数の決定
    基本となる関数の決定方法は,左側の引数から順番に各引数のデータ型を基準として,基準と優先度が同じか又はより優先度が低いデータ型の中で最も優先度の高いデータ型をパラメタに持つ関数を,基本となる関数とします。データ型が既定義型の場合は,表2-104の優先度に準じます。データ型が抽象データ型の場合は,次に示す表の優先度に準じます。

    表2-105 抽象データ型の優先度

    各引数のデータ型優先度
    抽象データ型同じデータ型→スーパタイプ
    (凡例)
    A→B:AがBより優先度が高いことを示します。
    注※
    抽象データ型定義中のUNDER句で直接指定するスーパタイプの方が,そのほかのスーパタイプよりも優先度が高くなります。
  5. 候補となる関数の決定
    引数が抽象データ型の場合,引数のデータとして取り得る実際の値のデータ型は,引数の定義の抽象データ型と同じデータ型又はサブタイプとなります。そのため,基本となる関数のほかに,引数の抽象データ型と同じデータ型又はサブタイプの抽象データ型を対応するパラメタに持つすべての関数が候補となる関数となります。
    候補となる関数が,基本となる関数一つだけの場合,その関数が呼び出す関数となります。関数の結果のデータ型は,呼び出す関数のRETURNS句のデータ型になります。
  6. RETURNS句のデータ型を用いた候補となる関数の絞り込み
    抽象データ型の引数を含む場合,基本となる関数のRETURNS句のデータ型と,基本となる関数以外の候補となる関数のRETURNS句のデータ型の互換性のチェックをします。RETURNS句のデータ型が互換性のない関数の場合,候補となる関数ではなくなります。
    互換性のチェックの後,残った候補となる関数のRETURNS句のデータ型を基に,関数の結果のデータ型を決定します。
    互換性のチェックの後,残った候補となる関数のRETURNS句のデータ型が抽象データ型の場合は,基本となる関数のRETURNS句の抽象データ型が結果のデータ型になります。
    互換性のチェックの後,残った候補となる関数の中にRETURNS句のデータ型が32,001バイト以上のBINARY型又はBLOB型の関数を含む場合は,次の規則に従います。
    • 結果のデータ長は,一番長いデータ長となります。
    • BINARY型とBLOB型が混在する場合は,BLOB型になります。
    その他の場合,結果のデータ型及びデータ長は,集合演算(UNION ALL,又はEXCEPT ALL)の結果のデータ型及びデータ長と同じになります。詳細については,「2.2 問合せ式」を参照してください。
  7. SQL文実行時の関数の決定
    2及び3で関数が一意に決まらない場合,SQL文実行時に,抽象データ型の引数の実際のデータ型によって,候補となる関数の中から呼び出す関数を一つに決定します。左側の引数より順番に,各引数の実際の値がナル値以外の場合はその値のデータ型を基準として,ナル値の場合はその引数のデータ型を基準とし,その基準のデータ型と同じか又はより優先度が低いデータ型の中で最も優先度の高いデータ型をパラメタとして持つ関数を候補となる関数の中から一つ決定し,呼び出す関数とします。
(例) 抽象データ型を含む場合の呼び出し関数の決定
A,B,Cを抽象データ型とし,CをBのスーパタイプ,BをAのスーパタイプとします(抽象データ型の優先度:A→B→C)。
(例1)
<前提条件>
表定義
CREATE TABLE T1(C1 C)
関数定義
f(A),f(B),f(C)
SQL文
SELECT f(C1) FROM T1
<結果>
基本となる関数
f(C)
関数呼出しがf(C1)の場合の候補となる関数
f(A),f(B),f(C)
呼び出し関数
SQL文実行時に呼び出す関数を次に示します。
T1.C1の実際の値呼び出し関数
A型f(A)
B型f(B)
C型f(C)
NULL値f(C)
(例2)
<前提条件>
表定義
CREATE TABLE T1(C1 C,C2 B)
関数定義
f(A,A),f(A,B),f(A,C),f(B,A),f(B,C),f(C,A),f(C,B),f(C,C)
SQL文
SELECT f(C1,C2) FROM T1
<結果>
基本となる関数
f(C,B)
関数呼出しがf(C1,C2)の場合の候補となる関数
f(A,A),f(A,B),f(A,C),f(B,A),f(B,C),f(C,A),f(C,B)
呼び出し関数
SQL文実行時に呼び出す関数を次に示します。
T1.C1の実際の値T1.C2の実際の値呼び出し関数
A型A型f(A,A)
B型f(A,B)
NULL値f(A,B)
B型A型f(B,A)
B型f(B,C)
NULL値f(B,C)
C型A型f(C,A)
B型f(C,B)
NULL値f(C,B)
NULL値A型f(C,A)
B型f(C,B)
NULL値f(C,B)