2008年12月15日 星期一

DB2 UDF using Common Table Expression (CTE) - DB2 9


/*
  implement CTE,UDF and Recursive SQL in the Scenario:
  giving the parameters year and quarter and
  returning the start and end date of the assigned parameters.
  運用 Recursive SQL 產生指定日曆天組一個 CTE
  包成一個User Define Function.
  input paramters: 年,季
  output table: two columns of 季的起始日,迄日
*/


/* create function */

CREATE FUNCTION UDF_QUARTER2DATE(nYear  VARCHAR(4),
                    nQuarter INTEGER)
RETURNS TABLE (MINDT  INTEGER,
         MAXDT  INTEGER)
LANGUAGE SQL
SPECIFIC UDF_QUARTER2DATE
BEGIN ATOMIC
RETURN
WITH N(DT) AS
(
SELECT DATE(SUBSTR(nYear,1,4) || '-01-01') DT
FROM  SYSIBM.SYSDUMMY1
UNION ALL
SELECT N.DT + 1 DAY
FROM  N
WHERE YEAR(N.DT + 1 DAY) <= INT(nYear)
)
SELECT MIN(INT(DT)),MAX(INT(DT))
FROM  N
WHERE QUARTER(DT) = nQuarter;
END

/* call function & return result */

SELECT * FROM TABLE(UDF_QUARTER2DATE('2008',3))

MINDT    MAXDT
----------- ------------
20080701  20080930