오라클에서 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
;