1. 인덱스 힌트를 제거한다.
2. NVL 함수를 ISNULL 혹은 IFNULL 함수로 변경한다.
3. SYSDATE 함수를 NOW() 함수로 변경한다.
4. TRUNC(SYSDATE)를 CONVERT(DATE,GETDATE(),12)로 변경한다.
trunc(sysdate)를 하면 시간이 잘린 연,월,일이 나온다. 예)19/05/09
이와 같은 역할을 하는 CONVERT를 사용한다.
5. Outerjoin 변경
[Oracle]
left outer joing : SELECT t1.*, t2.* FROM t1, t2 where t1.i1 = t2.i2(+);
right outer joing: SELECT t1.*, t2.* FROM t1, t2 where t1.i1(+) = t2.i2;
[MSSQL]
left outer joing : SELECT t1.*, t2.* FROM t1 LEFT OUTER JOIN t2 ON t1.i1 = t2.i2;
right outer joing: SELECT t1.*, t2.* FROM t1 RIGHT OUTER JOIN t2 ON t1.i1 = t2.i2;
!! From절에서 테이블명 중간에 , 가 없다는것과 ON 구문이 From절 바로 뒤에 오게 해야하는것에 주의 !!
6. TO_CHAR()를 CONVERT()으로 변환한다.
TO_CHAR(sysdate,'YYYYMMDD')의 경우
CONVERT(VARCHAR,GETDATE(),12)로 변환 .
아래는 추가로 다양한 형식에 맞게 사용
SELECT CONVERT(VARCHAR,getdate(),(120)) --//2019-05-09 2019-05-09 11:55:35
,CONVERT(VARCHAR,getdate(),(102)) --//2019.05.09
,CONVERT(VARCHAR,getdate(),(12)) --//190509
,CONVERT(VARCHAR,getdate(),(23)) --//2019-05-09
,LEFT(CONVERT(VARCHAR,getdate(),(23)),7) --//2019-05
,LEFT(CONVERT(VARCHAR,getdate(),(3)),2) //09
;
7. TO_DATE()를 CONVERT()으로 변환한다.
SELECT CONVERT(DATE,getdate(),(120)) --//2019-05-09 2019-05-09 11:55:35
,CONVERT(DATE,getdate(),(102)) --//2019.05.09
,CONVERT(DATE,getdate(),(12)) --//190509
,CONVERT(DATE,getdate(),(23)) --//2019-05-09
,LEFT(CONVERT(DATE,getdate(),(23)),7) --//2019-05
,LEFT(CONVERT(DATE,getdate(),(3)),2) //09
8. Where rownum <= 10 을 ROW_NUMBER()OVER() 로 변환
이때 주의 할 점은 SELECT 절에 TOP 100 PERCENT 붙여주어야 누락없이 다 뽑음
9. Subquery에서 alias가 없다면 붙인다.
예를 들면
select a, b from ( select a, b from ttt)
--> select t.a, t.b from ( select a, b from ttt) t
10. DELETE 테이블명 쿼리문을 DELETE FROM 테이블명 쿼리문으로 바꾸어준다.
11. Merge into의 경우는 쿼리문을 분리하여 DAO단에서 처리로직으로 변경해준다.
변경방법은 아래 두가지중에 하나를 선택해도 되고 다른 방법을 써도 된다.
(1) 조건이 맞는지(MATCHED)에 대한 SELECT문을 실행시켜서 결과값이
있으면 UPDATE문을 실행시켜 주고 결과값이 없으면 INSERT문을
실행시켜준다.
% rs.next()로 결과값이 있는지 판단
(2) UPDATE문을 실행해서 UPDATE가 일어나면 그대로 가고 UPDATE가
일어나지 않으면 INSERT문을 실행시킨다.
% ps.executeUpdate() > 0으로 UPDATE 판단
o 오라클 MergeInto 구문
MERGE INTO SERVICE_LOG FSL1
USING
(SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') AS DAYS, 'LS003' AS SERVICE_TYPE FROM DUAL ) FSL2
ON (FSL1.DAYS = FSL2.DAYS AND FSL1.SERVICE_TYPE = FSL2.SERVICE_TYPE)
WHEN MATCHED THEN
UPDATE SET FSL1.AGE_10_CNT = FSL1.AGE_10_CNT + 1
WHEN NOT MATCHED THEN
INSERT (FSL1.DAYS, FSL1.SERVICE_TYPE, FSL1.AGE_10_CNT)
VALUES (FSL2.DAYS, FSL2.SERVICE_TYPE, 1)
--------------------------------------------------------------------------------------
o MySQL 구문으로 변환처리 1
- DAO처리에서 조건이 맞는지(MATCHED) 안맞는지(NOT MATCHED) 비교하는 SELECT 쿼리문을 실행하고
그 결과에 따라서 업데이트와 인서트 처리를 해준다. SELECT 결과값이 있다면 업데이트,
SELECT 결과값이 없다면 인서트(rs.next()로 결과값이 있는지 판단)
if(getDAO().existServiceLog(conn, serviceType)) {
return getDAO().updateServiceLog(conn, memberInfo, serviceType);
}else{
return getDAO().insertServiceLog(conn, memberInfo, serviceType);
}
1) public boolean existServiceLog(Connection conn, String serviceType)
SELECT SERVICE_TYPE
FROM SERVICE_LOG USE INDEX(PRIMARY)
WHERE SERVICE_TYPE='LS003' AND DAYS=DATE_FORMAT(NOW(), '%Y%m%d')
2) public boolean updateServiceLog(Connection conn, Member memberInfo, String serviceType)
UPDATE SERVICE_LOG
SET AGE_10_CNT = AGE_10_CNT+1
WHERE SERVICE_TYPE='LS003' AND DAYS=DATE_FORMAT(NOW(), '%Y%m%d')
3) public boolean insertServiceLog(Connection conn, Member memberInfo, String serviceType)
INSERT SERVICE_LOG(DAYS, SERVICE_TYPE, AGE_10_CNT, AGE_20_CNT, AGE_30_CNT, AGE_40_CNT, AGE_50_CNT)
VALUES(DATE_FORMAT(NOW(), '%Y%m%d'), 'LS003', 1, 0, 0, 0, 0)
---------------------------------------------------------------------------------------------------------
o MySQL 구문으로 변환처리 2
- DAO처리에서 업데이트가 되었는지를 비교하는 구문을 실행해서 업데이트가 일어나면 그대로 진행되고
업데이트 일어나지 않으면 인서트를 실행해 준다(ps.executeUpdate() > 0으로 UPDATE 판단)
if(!getDAO.updateServiceLog(conn, memberInfo, serviceType)){
getDAO.insertServiceLog(conn, memberInfo, serviceType);
}
1) public boolean updateServiceLog(Connection conn, Member memberInfo, String serviceType)
UPDATE SERVICE_LOG
SET AGE_10_CNT = AGE_10_CNT+1
WHERE SERVICE_TYPE='LS003' AND DAYS=DATE_FORMAT(NOW(), '%Y%m%d')
을 실행해서 ps.executeUpdate() > 0;을 결과로 리턴한다. 업데이트가
일어나지 않으면 false를 반환하고 insert가 일어난다.
2) public boolean insertServiceLog(Connection conn, Member memberInfo, String serviceType)
INSERT SERVICE_LOG(DAYS, SERVICE_TYPE, AGE_10_CNT, AGE_20_CNT, AGE_30_CNT, AGE_40_CNT, AGE_50_CNT)
VALUES(DATE_FORMAT(NOW(), '%Y%m%d'), 'LS003', 1, 0, 0, 0, 0)
+ 자료형 변환
MySQL 을 Oracle 로 이전하기
MySQL의 내용을 Oracle로 옮기면서 사용한 내용을 정리함
1. 데이터 타입을 바꾼다.
MySQL 메뉴얼 : 7.2 Column types 참고
int(11) => number(11)
varchar(30) => varchar2(30)
char(30) => char(30)
TINYINT => number(3) : 255
SMALLINT => number(5) : 65535
MEDIUMINT => number(8) : 16777215
INT => number(10): 4294967295
BIGINT => number(20): 18446744073709551615
FLOAT => : 1.175494351E-38 to 3.402823466E+38
DOUBLE => : 2.2250738585072014E-308 to 1.7976931348623157E+308
DECIMAL =>
DATE => : 'YYYY-MM-DD'
DATETIME => : '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
TIMESTAMP => number(11)
TIME => : 'HH:MM:SS'
YEAR => : 1901 to 2155
CHAR => CHAR
VARCHAR => VARCHAR2
TINYBLOB
TINYTEXT => CHAR(255)
TEXT => VARCHAR2(65535) : (2^16 - 1)
BLOB
MEDIUMBLOB
MEDIUMTEXT => VARCHAR2(16777215) : (2^24 - 1)
LONGBLOB
LONGTEXT => VARCHAR2(4294967295) : (2^32 - 1)
ENUM
SET
2. auto_increment 인 경우 sequence 값을 만든다.
- "테이블이름_seq" 형식으로 만든다.
한 테이블에 여러개가 있으면 column_seq 로 추가한다.
- user 테이블의 no 인 경우는 user_seq 가 된다.
CREATE sequence tablename_seq
INCREMENT BY 1 -- 증가치
START WITH 1 -- 시작
MAXVALUE 9999999 -- 종점
NOCACHE --
NOCYCLE;
예)
create sequence SEQ_TEST increment by 1 start with 1
maxvalue 99999999 nocache nocycle;
insert into table_name (auto_inc_field) values(SEQ_TEST.NEXTVAL);
3. key 값
"PRIMARY KEY (no)" 는 그대로 설정해도 된다.
4. NOT NULL 과 DEFAULT 의 위치를 바꾼다.
서로 순서가 다른거 같다.
- MySQL
NOT NULL default '',
- Oracle
DEFAULT '' NOT NULL ,
5. \\\' 나 \\\" 로 되어 있는것을 '' 로 바꿔야 한다.
'IT > DB' 카테고리의 다른 글
mssql CONVERT yyyymmddhh24miss 포맷 (0) | 2019.05.09 |
---|---|
ORACLE에서 MSSQL로 PIVOT-FOR-IN 쿼리 변경 하는 방법 (0) | 2019.05.08 |
[ORACLE] ORA-00932: 일관성 없는 데이터 유형: NUMBER이(가) 필요하지만 CHAR임 해결 (0) | 2019.05.03 |
[mssql] TOP, OFFSET 또는 FOR XML을 함께 지정하지 않으면 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 ORDER BY 절을 사용할 수 없습니다. (0) | 2019.04.01 |
mssql 나누기 소수점이 안나올때 (정수로만 보여질때) (2) | 2019.04.01 |