오라클 to CUBRID로 마이그레이션 수행 시 주의사항
(CUBRID 8.4.0 이상 버전 기준, 2012/02/05)
1. derived table 이름의 명시
ORACLE의 경우 필요한 경우를 제외하고는 derived table 명을 생략해도 문제가 없으므로 일반적으로 사용을 잘 하지 않는데
비해 CUBRID 는 반드시 명시해주어야 한다.
ORACLE |
select * from (select sysdate from dual) |
CUBRID |
select * from (select sysdate from dual) tbl |
2. delete 질의에 대하여 from 생략
CUBRID에서 delete질의에 대하여 from을 생략할 경우 Syntax에러가 발생하므로 수정이 필요하다.
ORACLE |
delete tbl where ... |
CUBRID |
delete from tbl where ... |
3. connect by 사용시 수정
connect by 사용시 start with 가 뒤에 올 경우 ORACLE 에서는문제없으나, CUBRID 에서는 에러발생하므로
start with가 connect by보다 먼저나와야 한다.
ORACLE |
select * from a connect by prior id = pid start with id = 1 |
CUBRID |
select * from a connect by prior id = pid start with id = 1 select * from a start with id = 1 connect by prior id = pid |
4. order by 시 NULL 의 순서
order by 시 NULL의 값이 CUBRID는 제일 작은 값이나 ORACLE 은 제일 큰 값이므로 검색 결과 순위가 다르다.
CUBRID 8.4.1 버전 이하에서는 ORACLE처럼 order by ... nulls first, order by ... nulls last 를 지원하지 않으므로 주의한다.
ORACLE |
select id from a order by id 시 결과 순서 : 1, 2, 3, ..., NULL |
CUBRID |
select id from a order by id 시 결과 순서 : NULL, 1, 2, 3, ... |
5. ORACLE에서의 index 힌트
A. ORACLE에서는 select /*+ <테이블명 또는 alias> <인덱스명> */ 형태의 인덱스 힌트 기능이 있으며, CUBRID의 using index 문과
기능이 유사하다. 다만, CUBRID 예전 버전(8.3.x이하)버전의 경우에는 JOIN문에서 usingindex 뒤에 인덱스 명을 지정하지 않는 경우, 해당 테이블에 대해 full scan이 일어나므로, 반드시 각각의 테이블에 대한 인덱스명을 지정해주어야 한다.
ORACLE |
select /*+ tbl ix_tbl01 */ from tbl, tbl2 |
CUBRID 8.2.x~8.3.x버전 |
select from tbl, tbl2 |
CUBRID 8.4.0 이상 버전 |
select from tbl, tbl2 |
B. ORACLE에서 select /*+<INDEX_DESC> ( <테이블명 또는 alias> <인덱스명> ) */ 형태의 내림차순 인덱스 힌트 기능이 있다.
CUBRID에서는 /*+USE_DESC_IDX*/ 힌트와 using index 문을 결합하여 사용하여야 한다.
ORACLE |
select /*+ INDEX_DESC(tbl ix_tbl01) */ from tbl, tbl2 |
CUBRID 8.2.x~8.3.x버전 |
select /*+ USE_DESC_IDX */ from tbl, tbl2 |
CUBRID 8.4.0 이상 버전 |
select /*+ USE_DESC_IDX */ from tbl, tbl2 |
C. ORACLE에서는 LEADING 힌트를 제공하지만, CUBRID에서는 이를 지원하지않는다. 대신, /*+ORDERED*/ 힌트를 사용하여 수정할수 있다.
6. 테이블 생성시 컬럼 정보 뒤에 constraint 삽입
CUBRID는 foreign key 지정할 때 ORACLE 처럼 "constraint fk_id ..." 절을 사용할 수 없고, 컬럼 타입 다음에
foreign key references”절을사용하여야 한다.
ORACLE |
create table tbl (id int constraint pk_id primary key); |
CUBRID |
create table tbl (id int constraint pk_id primary key); |
7.스키마 생성시 소유자 지정
CUBRID은 스키마 생성문에서 직접 소유자를 지정할 수 없고, GRANT문을사용하여 다른 사용자에게 테이블 권한을 부여하여야 한다.
단, ORACLE의create tableusera.tbl 문이 실행은 되지만, 실제 소유자는 현재 데이터베이스에 로그인한 사용자이지 usera가 아니다.
A. 에러는 나지않지만 GRANT문을 실행하여야 테이블에 대한 사용자 권한을 부여할 수 있다.
ORACLE |
sys user로 로그인 |
CUBRID |
dba 유저로 로그인 GRANT ALL PRIVILLEGES ON tbl TO usera; usera에게 tbl에 대한 모든 권한을 부여해야 함. |
B. 인덱스 생성시에는에러
ORACLE |
sys user로 로그인 |
CUBRID |
dba 유저로 로그인 --> 에러 발생함. 테이블 소유자가 인덱스 소유자가 되므로, 인덱스 권한을 별도로 부여할 수 없음 --> OK |
8. row_number(), rank(), over() 함수
CUBRID에서는 row_number(), rank(), over()함수를 지원하지 않으므로, 질의수정을 하여야 한다.
[row_number() 함수]
[rank() 함수]
[over() 함수] - count-over, min-over, max-over, row_number-over, rank-over
ORACLE |
select a, id, count(*) over() from tbl where a>0 and a<101; |
CUBRID 8.4.1 이하 버전 |
select a, id, cnt from tbl, (select count(*) from tbl where a>0 and a<101) t(cnt) where a>0 and a<101; |
CUBRID에서는 이를지원하지 않으므로, insert문이나 replace문으로질의를 수정하여야 한다.
ORACLE |
MERGE INTO t_Target A |
10. SYS_GUID() 함수
32 bytes 의 중복되지않는 랜덤한 문자열 제공 함수이며, CUBRID에서는 지원하지 않으므로 질의 수정이 필요하다.
ORACLE |
sleect SYS_GUID() from dual; |
11. select … for update wait 10
ORACLE에서 해당레코드에 write lock 을 선점 후 select 해주는기능이며, CUBRID에서는 응용하여 처리해야 한다.
ORACLE |
select id from tbl for update wait 10 write lock 을 잡기 위해 10초동안 기다림. 10초 초과시 에러. |