오라클에서 DB2로 바꿀 때 사용하는 함수들과 UDF

 

1. NVL() => COALESCE()

 

2. DECODE() => CASE .. WHEN .. THEN .. END

 : 이함수는 converting 했을 때 열받았던 함수 이죠.. 다른 함수들은 앞에만 바꿔주면 되는데, 이함수는 일일이 when 절 then 절을 잘 구분해서 하나하나 써줘야 하니 ㅠㅠ 암튼 db2는 이런거는 좀 번거럽습니다.

 

3. ROWNUM => rowid

 : DB2 에서는 ROWNUM 이 없고 대체되는 것이 FETCH FIRST 1 ROW ONLY 라고 나오는데 아무리 써봐도 이거때메 에러 나더라구요~ 그래서 찾은게

FROM 절에 (SELECT ROWNUM() OVER() AS rowid, column1, column2, ... FROM 원래 테이블명 ) as temp 이렇게 써야 하더라구요~

예시) select rowid,b  from (select rownumber() over() as rowid, b from test) temp;

 

4. SYSDATE와 DUAL => CURRENT TIME 과 SYSIBM.SYSDUMMY1

 : 오라클에서의 시간알아볼때나 테이블이 없는경우로 테스트로 쓸 때 DUAL 을 쓰는데요~ DB2에서는 SYSIBM.SYSDUMMY1 으로 쓰죠~

 * SELECT SYSDATE FROM DUAL; => SELECT CURRENT TIME FROM SYSIBM.SYSDUMMY1; 으로 바뀔 수 있죠~

 

5. TO_DATE()

 : 그냥 DATE로 바꾸는 함수는 DB2에서 제공하는 함수로는 DATE() 라는 함수가 있는데요, 오라클처럼 쓰고 싶으면 UDF를 만들어서 사용하면 비슷하게 사용할 수 있습니다.(UDF는 참조란) 그런데 DATE는 TIMESTAMP를 많이 사용하는데요, TIMESTAMP_ISO(DATE | TIME | TIMESTAMP | VARCHAR) 로 TIMESTAMP로 바꿀 수 있습니다.

 

6. TO_CHAR()

 : CHAR() 라는 함수로 CHAR로 바꿀 수 있으며, 오라클 처럼 쓰려면 참조된 UDF로 추가하여 TO_CHAR를 쓸 수 있습니다.

 

7. UPPER() => UCASE()

 

8. 추가해야할 함수들[UDF함수 추가]

 1) LPAD()

 2) MONTHS_BETWEEN()

 3) LASTDAY()

 4) ADD_MONTHS()

 

9. 이건 함수 아니지만, OUTER JOIN 의 (+)은 안먹으니 LEFT OUTER JOIN, RIGHT OUTER JOIN 으로 다 바꿔야 합니다.

 

이 함수들은 주로 썼던 함수들이고요, 이거보다 더 많은 정보를 원하시는 분은 http://www.redbooks.ibm.com/abstracts/SG247048.html?Open 에서 PDF 파일을 받으셔서 참조하세요~

 

[참고란]

-- 첫번째 인자에서 두번째 인자(일)를 더한 날짜를 구한다.
-- 반환값 : DATE - 연산된 날짜를 반환한다.
-- 첫번째 인자 : DATE    - 날짜
-- 두번째 인자 : INTEGER - 일자
CREATE FUNCTION UTS.ADD_DAYS (ORGDATE DATE, ADD INTEGER)
 RETURNS DATE
 LANGUAGE SQL
 SPECIFIC UTS.ADD_DAYS
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
BEGIN ATOMIC
 DECLARE RTNDATE DATE;
 SET RTNDATE = ORGDATE + ADD days;
 RETURN RTNDATE;
END


;

CREATE FUNCTION UTS.ADD_MONTHS (ORGDATE DATE, ADD INTEGER)
 RETURNS DATE
 LANGUAGE SQL
 SPECIFIC UTS.ADD_MONTHS
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
BEGIN ATOMIC
 DECLARE RTNDATE DATE;
 SET RTNDATE = ORGDATE + ADD month;
 RETURN RTNDATE;
END
;

CREATE FUNCTION UTS.ADD_YEARS (ORGDATE DATE, ADD INTEGER)
 RETURNS DATE
 LANGUAGE SQL
 SPECIFIC UTS.ADD_YEARS
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
BEGIN ATOMIC
 DECLARE RTNDATE DATE;
 SET RTNDATE = ORGDATE + ADD years;
 RETURN RTNDATE;
END
;

-- 첫번째 인자일자에 두번째인자월을 더한 년월의 월말일을 구한다.
-- 반환값 : DATE - 연산된 날짜를 반환한다.
-- 첫번째 인자 : DATE       - 날짜
-- 두번째 인자 : INTEGER    - 월말일을 구하고자 하는 상대 개월(+,-가능)

CREATE FUNCTION UTS.AFTMONLASTDAY (MYDATE DATE, MYMONTH INTEGER)
 RETURNS DATE
 LANGUAGE SQL
 SPECIFIC UTS.AFTMONLASTDAY
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
BEGIN ATOMIC
 DECLARE TEMPDATE DATE;
 DECLARE NEXT_M INTEGER;

-- SET NEXT_M = MONTH(MYDATE)+1+MYMONTH;
 SET NEXT_M = MONTH(MYDATE + 1 MONTHS + MYMONTH MONTHS);
 SET TEMPDATE = MYDATE+MYMONTH MONTHS;

 WHILE (NEXT_M != MONTH(TEMPDATE)) do
   SET TEMPDATE = TEMPDATE + 1 DAYS;
 end while;
   
  RETURN TEMPDATE - 1 DAYS ;
END

;

-- 첫번째 인자일자에 두번째인자월을 더한 년월의 월말일을 구한다.
-- 반환값 : DATE - 연산된 날짜를 반환한다.
-- CHGDATE      IN NUMBER,                         --구법인세변경일
-- CHG2005DATE  IN NUMBER,                         --신법인세변경일
-- BALHAENGILJA   IN BDMASTSUB.BALHAENGILJA%TYPE,  -- 채권 발행일자

CREATE FUNCTION UTS.FUN_BONDIJAGB (CHGDATE INTEGER,
                                   CHG2005DATE INTEGER,
                                   BALHAENGILJA INTEGER,
                                   IJAGYESANGIGAN INTEGER,
                                   IJAGYESANGB CHAR(1),
                                   HALINYUL DECIMAL(7,4),
                                   MEIBILJA INTEGER,
                                   CHEORIILJA INTEGER)
 RETURNS CHAR(2)
 LANGUAGE SQL
 SPECIFIC UTS.FUN_BONDIJAGB
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
BEGIN ATOMIC
 DECLARE RTN_BONDIJAGB CHAR(2);

    IF (BALHAENGILJA >= CHG2005DATE OR MEIBILJA >= CHG2005DATE) THEN 
        SET RTN_BONDIJAGB = '00';
    ELSEIF (BALHAENGILJA < CHG2005DATE
         AND IJAGYESANGB IN ('3','8')
         AND HALINYUL = 0)             THEN
        IF (INTEGER(UTS.ADD_MONTHS(uts.int2date(CHEORIILJA),-1*IJAGYESANGIGAN))
             >= CHG2005DATE )             THEN
            SET RTN_BONDIJAGB = '00';
        ELSE
            SET RTN_BONDIJAGB = '99';
        END IF;
    ELSEIF (IJAGYESANGB IN ('3','8') AND HALINYUL <> 0) THEN
        IF (BALHAENGILJA < CHGDATE) THEN
            SET RTN_BONDIJAGB = '00';
        ELSE
            SET RTN_BONDIJAGB = '99';
        END IF;
    ELSE
        SET RTN_BONDIJAGB = '99';
    END IF;
   
  RETURN RTN_BONDIJAGB;
END

;

CREATE FUNCTION UTS.GETAFTERMONTHLAST (P_GIJUNILJA INTEGER,
                                    P_MONTH INTEGER )
RETURNS INTEGER
LANGUAGE SQL

BEGIN ATOMIC
    DECLARE RTNDATE INTEGER DEFAULT 0;
    SET RTNDATE = CASE
                 WHEN P_GIJUNILJA = 99999999 THEN 99999999
                 ELSE INTEGER(UTS.AFTMONLASTDAY (UTS.INT2DATE(P_GIJUNILJA), P_MONTH))
                 END;
    RETURN (RTNDATE);
END;

-- 시스템명  : 유가증권운용시스템
-- PKG NAME  : 기준일의 익전영업일자 산출 (영업일 기준)
-- 작 성 일  : 2003.02.09
-- 작 성 자  : 박종철
CREATE FUNCTION UTS.GETDAYTRADE(
    P_GIJUNILJA  INTEGER,
    P_ILSU       INTEGER)
 RETURNS INTEGER
 LANGUAGE SQL
 DETERMINISTIC
 NO EXTERNAL ACTION
 READS SQL DATA
 BEGIN ATOMIC
  DECLARE R_RTNDATE     INTEGER;
  IF P_ILSU > 0 THEN
    IF P_GIJUNILJA >= 20020701 THEN
      SET R_RTNDATE = (SELECT CASE P_GIJUNILJA
                                WHEN 0 THEN 99999999
                                WHEN 99999999 THEN 99999999
                                ELSE MIN(YEAR*10000+MONTH*100+DAY) END
                         FROM CMILJAMS
                        WHERE YEAR*10000+MONTH*100+DAY > P_GIJUNILJA
                          AND GONILGB = 0 AND YOIL <> 6);
    ELSE
      SET R_RTNDATE = (SELECT CASE P_GIJUNILJA
                                WHEN 0 THEN 99999999
                                WHEN 99999999 THEN 99999999
                                ELSE MIN(YEAR*10000+MONTH*100+DAY) END
                         FROM CMILJAMS
                        WHERE YEAR*10000+MONTH*100+DAY > P_GIJUNILJA
                          AND GONILGB = 0 );
    END IF;
  ELSE
    IF P_GIJUNILJA >= 20020701 THEN
      SET R_RTNDATE = (SELECT CASE P_GIJUNILJA
                                WHEN 0 THEN 99999999
                                WHEN 99999999 THEN 99999999
                                ELSE MAX(YEAR*10000+MONTH*100+DAY) END
                         FROM CMILJAMS
                        WHERE YEAR*10000+MONTH*100+DAY < P_GIJUNILJA
                          AND GONILGB = 0 AND YOIL <> 6 );
    ELSE
      SET R_RTNDATE = (SELECT CASE P_GIJUNILJA
                                WHEN 0 THEN 99999999
                                WHEN 99999999 THEN 99999999
                                ELSE MAX(YEAR*10000+MONTH*100+DAY) END
                         FROM CMILJAMS
                        WHERE YEAR*10000+MONTH*100+DAY < P_GIJUNILJA
                          AND GONILGB = 0 );
    END IF;
  END IF;
  RETURN (R_RTNDATE);

 END
;

-- 인자로 받은 년도의 1월 1일을 반환한다.
-- 반환값 : INTEGER - 해당연도의 1월 1일 ex)20060101
-- 인  자 : INTEGER - 날짜(YYYYMMDD 형식)
CREATE FUNCTION UTS.GETFIRSTOFYEAR (ORGDATE INTEGER)
 RETURNS INTEGER
 LANGUAGE SQL
 SPECIFIC UTS.GETFIRSTOFYEAR
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
BEGIN ATOMIC
 DECLARE RTNDATE INTEGER;
 DECLARE VDATE DATE;
 IF ORGDATE = 0 THEN
  SET RTNDATE = 0;
 ELSE
  SET VDATE = UTS.INT2DATE(ORGDATE);
  SET RTNDATE = INTEGER(SUBSTR(CHAR(ORGDATE),1,4) || '0101');
 END IF;
 RETURN RTNDATE;
END
;

CREATE FUNCTION UTS.GETGYEJEONGNAME(
    P_GYEJEONGCODE  VARCHAR(20),
    P_HOSTGUBUN     INTEGER)  --1:HOST , 2:TRAVIS
 RETURNS  VARCHAR(80)
 LANGUAGE SQL
 DETERMINISTIC
 NO EXTERNAL ACTION
 READS SQL DATA
 BEGIN ATOMIC
  DECLARE R_GYEJEONGNAME     VARCHAR(80);
  DECLARE W_LEVELGB          INTEGER;
  DECLARE W_GYEJEONGNAME     VARCHAR(60);
  DECLARE W_SPACE            VARCHAR(10);
  DECLARE W_CNT              INTEGER;
  SET W_LEVELGB = 0;
  SET W_CNT = 0;
  IF P_HOSTGUBUN = 1 THEN
   SET ( W_LEVELGB , W_GYEJEONGNAME )=(
    SELECT MAX(LEVELGB) AS LEVELGB,MAX(HOSTNAME) AS HOSTNAME
      FROM (SELECT DISTINCT INTEGER(COALESCE(LEVELGB,'0')) AS LEVELGB ,
                   MAX(HOSTCODE) AS HOSTCODE,MAX(HOSTNAME) AS HOSTNAME
              FROM ACMASTER
             WHERE HOSTCODE = P_GYEJEONGCODE
               AND INPUTGB = 'I'
             GROUP BY LEVELGB) A );
  ELSE
   SET ( W_LEVELGB , W_GYEJEONGNAME )=(
    SELECT INTEGER(COALESCE(LEVELGB,'0')) AS LEVELGB ,
           GYEJEONGNAME AS GYEJEONGNAME
      FROM ACMASTER
     WHERE GYEJEONGCODE = P_GYEJEONGCODE);
  END IF;

  IF W_LEVELGB = 0 THEN
   SET R_GYEJEONGNAME = W_GYEJEONGNAME;
  ELSE
   SET W_LEVELGB = W_LEVELGB - 1;
  END IF;

  SET W_SPACE='';
  SET R_GYEJEONGNAME ='';
  WHILE W_CNT <= W_LEVELGB DO
     SET W_SPACE = W_SPACE||' ';
     SET W_CNT = W_CNT + 1;
  END WHILE;
  SET R_GYEJEONGNAME = W_SPACE||W_GYEJEONGNAME;
  RETURN (R_GYEJEONGNAME);

 END
;

CREATE FUNCTION UTS.GETJYGRADE( P_CODE  VARCHAR(15))
 RETURNS  INTEGER
 LANGUAGE SQL
 DETERMINISTIC
 NO EXTERNAL ACTION
 READS SQL DATA
 BEGIN ATOMIC
  DECLARE R_ORDER     INTEGER;
  DECLARE CODE        VARCHAR(15);

  SET R_ORDER = 0;
  SET CODE = RTRIM(P_CODE);

   IF CODE = 'AAA+'      THEN -- #### A CLASS ##### */
      SET R_ORDER = 100;
   ELSEIF CODE = 'AAA' OR CODE = 'AAA0' THEN
      SET R_ORDER = 104;
   ELSEIF CODE = 'AAA-'   THEN
      SET R_ORDER = 108;
   ELSEIF CODE = 'AA+'    THEN
      SET R_ORDER = 112;
   ELSEIF CODE = 'AA'  OR CODE = 'AA0' OR CODE = 'AA00' THEN
      SET R_ORDER = 116;
   ELSEIF CODE = 'AA-'    THEN
      SET R_ORDER = 120;
   ELSEIF CODE = 'A1+'     THEN
      SET R_ORDER = 124;
   ELSEIF CODE = 'A1'     THEN
      SET R_ORDER = 128;
   ELSEIF CODE = 'A1-'     THEN
      SET R_ORDER = 132;
   ELSEIF CODE = 'A2+'     THEN
      SET R_ORDER = 136;
   ELSEIF CODE = 'A2'     THEN
      SET R_ORDER = 140;
   ELSEIF CODE = 'A2-'     THEN
      SET R_ORDER = 144;
   ELSEIF CODE = 'A3+'     THEN
      SET R_ORDER = 148;
   ELSEIF CODE = 'A3'     THEN
      SET R_ORDER = 152;
   ELSEIF CODE = 'A3-'     THEN
      SET R_ORDER = 156;
   ELSEIF CODE = 'A+'     THEN
      SET R_ORDER = 160;
   ELSEIF CODE = 'A'   OR CODE = 'A0'  OR CODE = 'A00' OR CODE = 'A000' THEN
      SET R_ORDER = 164;
   ELSEIF CODE = 'A-'     THEN
      SET R_ORDER = 168;
   ELSEIF CODE = 'BBB+'      THEN  -- #### B CLASS ##### */
      SET R_ORDER = 200;
   ELSEIF CODE = 'BBB' OR CODE = 'BBB0' THEN
      SET R_ORDER = 204;
   ELSEIF CODE = 'BBB-'   THEN
      SET R_ORDER = 208;
   ELSEIF CODE = 'BB+'    THEN
      SET R_ORDER = 212;
   ELSEIF CODE = 'BB'  OR CODE = 'BB0' OR CODE = 'BB00' THEN
      SET R_ORDER = 216;
   ELSEIF CODE = 'BB-'    THEN
      SET R_ORDER = 220;
   ELSEIF CODE = 'B1+'     THEN
      SET R_ORDER = 224;
   ELSEIF CODE = 'B1'     THEN
      SET R_ORDER = 228;
   ELSEIF CODE = 'B1-'     THEN
      SET R_ORDER = 232;
   ELSEIF CODE = 'B2+'     THEN
      SET R_ORDER = 236;
   ELSEIF CODE = 'B2'     THEN
      SET R_ORDER = 240;
   ELSEIF CODE = 'B2-'     THEN
      SET R_ORDER = 244;
   ELSEIF CODE = 'B3+'     THEN
      SET R_ORDER = 248;
   ELSEIF CODE = 'B3'     THEN
      SET R_ORDER = 252;
   ELSEIF CODE = 'B3-'     THEN
      SET R_ORDER = 256;
   ELSEIF CODE = 'B+'     THEN
      SET R_ORDER = 260;
   ELSEIF CODE = 'B'   OR CODE = 'B0'  OR CODE = 'B00' OR CODE = 'B000' THEN
      SET R_ORDER = 264;
   ELSEIF CODE = 'B-'     THEN
      SET R_ORDER = 268;
   ELSEIF CODE = 'CCC+'      THEN -- #### C CLASS ##### */
      SET R_ORDER = 300;
   ELSEIF CODE = 'CCC' OR CODE = 'CCC0' THEN
      SET R_ORDER = 304;
   ELSEIF CODE = 'CCC-'   THEN
      SET R_ORDER = 308;
   ELSEIF CODE = 'CC+'    THEN
      SET R_ORDER = 312;
   ELSEIF CODE = 'CC'  OR CODE = 'CC0' OR CODE = 'CC00' THEN
      SET R_ORDER = 316;
   ELSEIF CODE = 'CC-'    THEN
      SET R_ORDER = 320;
   ELSEIF CODE = 'C+'     THEN
      SET R_ORDER = 324;
   ELSEIF CODE = 'C'   OR CODE = 'C0'  OR CODE = 'C00' OR CODE = 'C000' THEN
      SET R_ORDER = 328;
   ELSEIF CODE = 'C-'     THEN
      SET R_ORDER = 332;
   ELSEIF CODE = 'DDD+'      THEN -- #### D CLASS ##### */
      SET R_ORDER = 400;
   ELSEIF CODE = 'DDD' OR CODE = 'DDD0' THEN
      SET R_ORDER = 404;
   ELSEIF CODE = 'DDD-'   THEN
      SET R_ORDER = 408;
   ELSEIF CODE = 'DD+'    THEN
      SET R_ORDER = 412;
   ELSEIF CODE = 'DD'  OR CODE = 'DD0' OR CODE = 'DD00' THEN
      SET R_ORDER = 416;
   ELSEIF CODE = 'DD-'    THEN
      SET R_ORDER = 420;
   ELSEIF CODE = 'D+'     THEN
      SET R_ORDER = 424;
   ELSEIF CODE = 'D'   OR CODE = 'D0'  OR CODE = 'D00' OR CODE = 'D000' THEN
      SET R_ORDER = 428;
   ELSEIF CODE = 'D-'     THEN
      SET R_ORDER = 432;
   ELSEIF CODE = 'EEE+'      THEN -- #### D CLASS ##### */
      SET R_ORDER = 500;
   ELSEIF CODE = 'EEE' OR CODE = 'EEE0' THEN
      SET R_ORDER = 504;
   ELSEIF CODE = 'EEE-'   THEN
      SET R_ORDER = 508;
   ELSEIF CODE = 'EE+'    THEN
      SET R_ORDER = 512;
   ELSEIF CODE = 'EE'  OR CODE = 'EE0' OR CODE = 'EE00' THEN
      SET R_ORDER = 516;
   ELSEIF CODE = 'EE-'    THEN
      SET R_ORDER = 520;
   ELSEIF CODE = 'E+'     THEN
      SET R_ORDER = 524;
   ELSEIF CODE = 'E'   OR CODE = 'E0'  OR CODE = 'E00' OR CODE = 'E000' THEN
      SET R_ORDER = 528;
   ELSEIF CODE = 'E-'     THEN
      SET R_ORDER = 532;
   ELSE
      SET R_ORDER = 0;
   END IF;
   RETURN (R_ORDER);
END
;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.GREAT( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
CREATE FUNCTION UTS.GREAT( VAR1 DATE , VAR2 DATE )
 RETURNS DATE
--CREATE FUNCTION UTS.GREAT( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
--CREATE FUNCTION UTS.GREAT( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
--CREATE FUNCTION UTS.GREAT( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
--CREATE FUNCTION UTS.GREAT( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 > VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.GREAT( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.GREAT( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
--CREATE FUNCTION UTS.GREAT( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
--CREATE FUNCTION UTS.GREAT( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
--CREATE FUNCTION UTS.GREAT( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
CREATE FUNCTION UTS.GREAT( VAR1 DECIMAL , VAR2 DECIMAL )
 RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 > VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.GREAT( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.GREAT( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
--CREATE FUNCTION UTS.GREAT( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
--CREATE FUNCTION UTS.GREAT( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
CREATE FUNCTION UTS.GREAT( VAR1 DOUBLE , VAR2 DOUBLE )
 RETURNS DOUBLE
--CREATE FUNCTION UTS.GREAT( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 > VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.GREAT( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.GREAT( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
--CREATE FUNCTION UTS.GREAT( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
CREATE FUNCTION UTS.GREAT( VAR1 INTEGER , VAR2 INTEGER )
 RETURNS INTEGER
--CREATE FUNCTION UTS.GREAT( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
--CREATE FUNCTION UTS.GREAT( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 > VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.GREAT( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.GREAT( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
CREATE FUNCTION UTS.GREAT( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
 RETURNS TIMESTAMP
--CREATE FUNCTION UTS.GREAT( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
--CREATE FUNCTION UTS.GREAT( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
--CREATE FUNCTION UTS.GREAT( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 > VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
CREATE FUNCTION UTS.GREAT( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
 RETURNS VARCHAR(1000)
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 > VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

CREATE FUNCTION UTS.INT2DATE (DATENUM integer)
 RETURNS DATE
 LANGUAGE SQL
 SPECIFIC UTS.INT2DATE
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
 RETURN
CASE
 WHEN DATENUM > 19000000 THEN
   DATE( SUBSTR(CHAR(DATENUM),1,4)||'-'||
         SUBSTR(CHAR(DATENUM),5,2)||'-'||
         SUBSTR(CHAR(DATENUM),7,2) )
 ELSE DATE('1900-01-01')
END
;

-- 첫번째 인자일자의 월말일을 구한다.
-- 반환값 : DATE - 연산된 날짜를 반환한다.
-- 첫번째 인자 : DATE    - 날짜

CREATE FUNCTION UTS.LASTDAY (MYDATE DATE)
 RETURNS DATE
 LANGUAGE SQL
 SPECIFIC UTS.LASTDAY
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
BEGIN ATOMIC
 DECLARE TEMPDATE DATE;
 DECLARE NEXT_M INTEGER;

-- SET NEXT_M = MONTH(MYDATE)+1;
 SET NEXT_M = MONTH(MYDATE + 1 MONTHS);

 SET TEMPDATE = MYDATE;

 WHILE (NEXT_M != MONTH(TEMPDATE)) do
--   SET TEMPDATE = TEMPDATE + 1 DAY;
   SET TEMPDATE = TEMPDATE + 1 DAYS;
 end while;
   
  RETURN TEMPDATE - 1 DAY ;
END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.LEAST( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
CREATE FUNCTION UTS.LEAST( VAR1 DATE , VAR2 DATE )
 RETURNS DATE
--CREATE FUNCTION UTS.LEAST( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
--CREATE FUNCTION UTS.LEAST( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
--CREATE FUNCTION UTS.LEAST( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
--CREATE FUNCTION UTS.LEAST( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 < VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.LEAST( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.LEAST( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
--CREATE FUNCTION UTS.LEAST( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
--CREATE FUNCTION UTS.LEAST( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
--CREATE FUNCTION UTS.LEAST( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
CREATE FUNCTION UTS.LEAST( VAR1 DECIMAL , VAR2 DECIMAL )
 RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 < VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.LEAST( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.LEAST( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
--CREATE FUNCTION UTS.LEAST( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
--CREATE FUNCTION UTS.LEAST( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
CREATE FUNCTION UTS.LEAST( VAR1 DOUBLE , VAR2 DOUBLE )
 RETURNS DOUBLE
--CREATE FUNCTION UTS.LEAST( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 < VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.LEAST( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.LEAST( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
--CREATE FUNCTION UTS.LEAST( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
CREATE FUNCTION UTS.LEAST( VAR1 INTEGER , VAR2 INTEGER )
 RETURNS INTEGER
--CREATE FUNCTION UTS.LEAST( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
--CREATE FUNCTION UTS.LEAST( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 < VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
--CREATE FUNCTION UTS.LEAST( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
-- RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.LEAST( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
CREATE FUNCTION UTS.LEAST( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
 RETURNS TIMESTAMP
--CREATE FUNCTION UTS.LEAST( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
--CREATE FUNCTION UTS.LEAST( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
--CREATE FUNCTION UTS.LEAST( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 < VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

-- 인자와 반환값을 DATE, VARCHAR(1000), TIMESTAMP,INTEGER, DOUBLE, DECIMAL
-- 로 수정하여 모두 등록
CREATE FUNCTION UTS.LEAST( VAR1 VARCHAR(1000) , VAR2 VARCHAR(1000) )
 RETURNS VARCHAR(1000)
--CREATE FUNCTION UTS.LEAST( VAR1 DATE , VAR2 DATE )
-- RETURNS DATE
--CREATE FUNCTION UTS.LEAST( VAR1 TIMESTAMP , VAR2 TIMESTAMP )
-- RETURNS TIMESTAMP
--CREATE FUNCTION UTS.LEAST( VAR1 INTEGER , VAR2 INTEGER )
-- RETURNS INTEGER
--CREATE FUNCTION UTS.LEAST( VAR1 DOUBLE , VAR2 DOUBLE )
-- RETURNS DOUBLE
--CREATE FUNCTION UTS.LEAST( VAR1 DECIMAL , VAR2 DECIMAL )
-- RETURNS DECIMAL
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   IF VAR1 < VAR2 THEN
     RETURN VAR1;
   ELSE
     RETURN VAR2;
   END IF;

END

;

--LPAD 이게 주석으로 먹을까???
CREATE FUNCTION UTS.LPAD (C1 VarChar(4000), N integer, C2 VarChar(4000))
 RETURNS VARCHAR(4000)
 LANGUAGE SQL
 SPECIFIC UTS.LPADBase
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
 RETURN
 CASE
   WHEN N > length(C1) THEN
    rtrim(substr(repeat(C2,(N-length(C1)+length(C2))/(length(C2)+1-sign(length(C2)))),1,N-length(C1)) || C1)
   ELSE rtrim(substr(C1,1,N))
 END
;

CREATE FUNCTION UTS.STR2DATE (DATESTR VARCHAR(9))
 RETURNS DATE
 LANGUAGE SQL
 SPECIFIC UTS.STR2DATE
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
 RETURN
CASE
 WHEN LENGTH(DATESTR) = 8 THEN
  UTS.INT2DATE( INTEGER(DATESTR) )
 ELSE DATE('1900-01-01')
END
;

CREATE FUNCTION UTS.TO_CHAR (T1 TIMESTAMP, FORMAT VARCHAR(32))
 RETURNS VARCHAR(26)
 LANGUAGE SQL
 SPECIFIC UTS.TO_CHAR
 DETERMINISTIC
 CONTAINS SQL
 NO EXTERNAL ACTION
BEGIN ATOMIC
 DECLARE CHS_TMSTMP CHAR ( 26 );
 DECLARE RETVAL VARCHAR ( 26 );
 SET CHS_TMSTMP = CHAR ( T1 );

 IF UPPER(UTS.TRIM ( FORMAT )) = 'DD' THEN SET RETVAL = SUBSTR (CHS_TMSTMP,9,2);
 ELSEIF UPPER(UTS.TRIM ( FORMAT )) = 'MM' THEN SET RETVAL = SUBSTR (CHS_TMSTMP,6,2);
 ELSEIF UPPER(UTS.TRIM ( FORMAT )) = 'YYYY' THEN SET RETVAL = SUBSTR (CHS_TMSTMP,1,4);
 ELSEIF UPPER(UTS.TRIM ( FORMAT )) = 'YYYY-MM' THEN SET RETVAL = SUBSTR (CHS_TMSTMP,1,7);
 ELSEIF UPPER(UTS.TRIM ( FORMAT )) = 'YYYY-MM-DD' THEN SET RETVAL = SUBSTR (CHS_TMSTMP,1,10);
 ELSEIF UPPER(UTS.TRIM ( FORMAT )) = 'YYYYMMDD' THEN SET RETVAL = SUBSTR (CHS_TMSTMP,1,4)||SUBSTR(CHS_TMSTMP,6,2)||SUBSTR(CHS_TMSTMP,9,2);
 ELSEIF UPPER(UTS.TRIM ( FORMAT )) = 'D' THEN SET RETVAL = CHAR(DAYOFWEEK(CHS_TMSTMP));
 ELSEIF UPPER(UTS.TRIM ( FORMAT )) = 'HH24MISS' THEN SET RETVAL = SUBSTR (CHS_TMSTMP,12,2)||SUBSTR(CHS_TMSTMP,15,2)||SUBSTR(CHS_TMSTMP,18,2);
 ELSE   SET RETVAL = 'INVALID FORMAT SPECIFIED.' ;
 END IF;
 RETURN RETVAL;
END
;

CREATE FUNCTION UTS.TO_DATE( MYDATE VARCHAR(8) , FMT VARCHAR(32) )
 RETURNS TIMESTAMP  
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
   DECLARE CHS_TMSTMP TIMESTAMP;
   DECLARE TMP_LEN INTEGER;
   IF MYDATE IS NULL THEN
     RETURN CURRENT TIMESTAMP;
   ELSE
     SET TMP_LEN=LENGTH(RTRIM(FMT));
     IF TMP_LEN=8 THEN
       SET TMP_LEN=0;
     END IF;
     IF TMP_LEN=10 THEN
       SET TMP_LEN=0;
     END IF;
     IF TMP_LEN=14 THEN
       SET TMP_LEN=0;
     END IF;
     IF TMP_LEN=19 THEN
       SET TMP_LEN=0;
     END IF;
  END IF;
     RETURN CHS_TMSTMP;

END

;

CREATE FUNCTION UTS.TRIM(INSTR VARCHAR(4000))
 RETURNS  VARCHAR(4000)
 DETERMINISTIC
 NO EXTERNAL ACTION
 CONTAINS SQL
 BEGIN ATOMIC
     DECLARE  TMPSTR VARCHAR(4000) DEFAULT  '';
     DECLARE  REVSTR VARCHAR(4000) DEFAULT  '';
     IF  INSTR IS NULL THEN
         RETURN  NULL;
     END IF;
     SET  TMPSTR = RTRIM(INSTR);
     SET  REVSTR = LTRIM(TMPSTR);
     RETURN  REVSTR;
 END
;

 

+ Recent posts