例: SQL 表 UDF

ここでは、パイプライン化されていない表関数とパイプライン化 された表関数の両方の例を示します。データを返すために使用される照会は 同じ基本的なものです。

次のパイプライン化されていない表関数は、日付に基づいてデータを返します。RETURN ステートメントに照会が含まれている必要があります。

CREATE FUNCTION PROJFUNC(indate DATE) 
  RETURNS TABLE (PROJNO CHAR(6), ACTNO SMALLINT, ACSTAFF DECIMAL(5,2), 
           ACSTDATE DATE, ACENDATE DATE) 
  BEGIN 
   RETURN SELECT * FROM PROJACT 
     WHERE ACSTDATE<=indate; 
  END

この関数は次のよう呼び出すことができます。

SELECT * FROM TABLE(PROJFUNC(:datehv)) X

パイプライン化されていない SQL 表関数には、ただ 1 つの RETURN ステートメントが必要です。

次のパイプライン化された表関数は、日付に基づいてデータを返します。照会によって返される列値に加えて、 プロジェクトが前年から持ち越されているかどうかを示す標識も返されます。

CREATE FUNCTION PROJFUNC(indate DATE) 
  RETURNS TABLE (PROJNO CHAR(6), ACTNO SMALLINT, ACSTAFF DECIMAL(5,2), 
           ACSTDATE DATE, ACENDATE DATE, CARRYOVER CHAR(1)) 
  BEGIN 
    FOR C1 CURSOR FOR SELECT * FROM PROJACT 
       WHERE ACSTDATE<=indate DO 
      IF YEAR(ACSTDATE) < YEAR(indate) THEN 
        PIPE (PROJNO, ACTNO, ACSTAFF, ACSTDATE, ACENDATE, 'Y');
      ELSE
        PIPE (PROJNO, ACTNO, ACSTAFF, ACSTDATE, ACENDATE, 'N');
      END IF;
    END FOR;
    RETURN;
  END

この関数は、パイプライン化されていない関数と同じように呼び出すことができます。

SELECT * FROM TABLE(PROJFUNC(:datehv)) X

パイプライン化された SQL 表関数は、任意の数の PIPE ステートメントを含むことができます。各 PIPE ステートメントはすべての結果列の値を返す必要があります。処理の終わりに、 RETURN ステートメントの実行が必要です。パイプライン化された関数の本体でできることは、表の照会に限りません。別のプログラムを呼び出したり、API から情報を取得したり、他のシステムのデータを照会したりでき、 その後でそれらの結果を結合し、1 つ以上の PIPE ステートメントを使用して結果表として返す行値を決定します。