SQL スカラー関数

SQL スカラー関数 は、SQLで作成されたユーザー定義関数であり、呼び出されるたびに単一の値を返します。 SQL スカラー関数には、ユーザー定義関数定義の中にユーザー定義関数用のソース・コードが入っています。 SQL スカラー関数には、インライン化とコンパイルの 2 種類があります。

DB2® 10の前に作成されたすべてのSQLスカラー関数は、インラインSQLスカラー関数です。 DB2 10から始め、SQLスカラー関数はインライン化またはコンパイルされたものとして作成できます。

Db2 は、関数を定義する CREATE FUNCTION ステートメントが拡張機能を使用するかどうかに応じて、 SQL スカラー関数がインライン化またはコンパイルされるかどうかを決定します。 CREATE FUNCTION 文(インライン SQL スカラー関数 )および CREATE FUNCTION 文(コンパイルされた SQL スカラー関数 )を参照してください。

インライン SQL スカラー関数には、RETURN ステートメントを 1 つ持つ本体があります。 RETURN ステートメントは、NULL 値、またはスカラー全選択を参照しない単純式のいずれかを返す場合があります。 インライン SQL スカラー関数には、パッケージは生成されません。 (関数が呼び出される場合) 関数を参照する SQL ステートメントの準備中に、関数の RETURN ステートメントで指定された式が、単にその SQL ステートメントに組み込まれます。

コンパイル済み SQL スカラー関数では、SQL PL 言語で記述されたロジックを持つ本体を使用できます。 CREATE FUNCTION ステートメントでは任意の拡張機能 (パラメーター用の TABLE LOCATOR データ・タイプのサポート、各種のオプション、およびスカラー全選択への参照を許可する拡張 RETURN ステートメント) を使用できます。 コンパイル済み SQL スカラー関数には、パッケージが作成されます。

コンパイル済み SQL スカラー関数には、バージョンとソース・コード管理のサポートが含まれます。 コンパイル済み SQL スカラー関数は、以下のタスクに使用できます。

  • SQL スカラー関数の複数のバージョンを定義します。この場合、 1 つのバージョンは active バージョンと見なされます。
  • SQL スカラー関数の特定のバージョンを起動します。
  • SQL スカラー関数のバージョンに関連付けられているルーチン・オプションを変更します。
  • 現行バージョンと同じ関数シグニチャー、異なるルーチン・オプションおよび関数本体を指定することにより、新しいバージョンの SQL スカラー関数を定義します。
  • 現行バージョンと同じ関数シグニチャー、異なるルーチン・オプションと関数本体を指定して、既存のバージョンの定義を置換します。
  • SQL スカラー関数のバージョンをドロップする。
  • 明示的な再バインドや再コンパイルを必要とせずに、以前のバージョンをアクティブにすることで以前のバージョンに戻ります。

コンパイル済み SQL スカラー関数を複数のサーバーにデプロイすると、 より広いコミュニティーが、ルーチン本体のロジックを変更するというリスクを冒すことなく、 細部までテスト済みの関数を使用できるようにすることができます。 Unified Debugger を使用して、 Db2 for z/OS® サーバー上で実行されるコンパイル済み SQL スカラ関数をリモートでデバッグします。

SQL スカラー関数を実行するための準備としては、CREATE FUNCTION ステートメントを静的または動的に実行します。

例: コンパイル済み SQL スカラー・ユーザー定義関数の定義

以下の例では、入力ストリングのテキストを逆順で戻すスカラー関数を定義します。 また、この例では、各種 SQL ステートメントがコンパイル済み SQL スカラー関数で使用できる理由を判別する方法についても説明します。

コンパイルされたSQLスカラーCREATE FUNCTION文には、 CREATE FUNCTION文(コンパイルされたSQLスカラー関数 )で定義されているように、 SQLルーチン本体が含まれています。 SQL-routine-body の構文図は、関数本体を単一の SQL 制御ステートメントとして定義します。 SQL手続き言語(SQL PL )における SQL制御文の構文図では、RETURN文を含む指定可能な制御文が特定されています。

最外部の SQL ステートメントが、他の SQL ステートメントを含む SQL-control-statement である場合、SQL 関数には複数の SQL ステートメントを含めることができます。 これらのステートメントは、SQL プロシージャー・ステートメントとして定義されます。 SQL-procedure-statement(SQL PL) の構文図では、制御文内で指定できるSQL文を特定します。 SQL-procedure-statement の構文の注記では、SQL 関数で使用できる SQL ステートメントが明確になります。

    CREATE FUNCTION REVERSE(INSTR VARCHAR(4000))
      RETURNS VARCHAR(4000)
      DETERMINISTIC NO EXTERNAL ACTION
      CONTAINS SQL
      BEGIN  A 
      DECLARE REVSTR, RESTSTR VARCHAR(4000) DEFAULT '';  B 
      DECLARE LEN INT;  B 
      IF INSTR IS NULL THEN  C 
      RETURN NULL;  D 
      END IF;
      SET (RESTSTR, LEN) = (INSTR, LENGTH(INSTR));  E 
      WHILE LEN > 0 DO  F 
      SET (REVSTR, RESTSTR, LEN)  E 
        = (SUBSTR(RESTSTR, 1, 1) CONCAT REVSTR, 
        SUBSTR(RESTSTR, 2, LEN - 1),
        LEN - 1);
     END WHILE;
     RETURN REVSTR;  D 
   END#  A 
SQL 関数には、以下のキーワードとステートメントがあります。
  • BEGINとENDキーワード (A)は、複合文の開始と終了を示します。
  • DECLARE文 (B) は複合文の構成要素であり、複合文内でSQL変数を定義します。 複合文の詳細については、 複合文を参照してください。
  • IF文 (C )、RETURN文 (D )、WHILE文 (F )は、SQL制御文です。
  • SET 割り当て文 (E) は、SQL 変数に値を割り当てる SQL 制御文です。

SQL 変数名は、それが宣言されたコンパウンド・ステートメント内の任意の場所で参照することができます。そのコンパウンド・ステートメント内で直接または間接的にネストされた SQL ステートメントも同様です。 詳細は、SQL PLのSQLパラメータと変数の参照を参照してください。