Background Image
조회 수 49529 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 

오라클 개발자를 위한 큐브리드 SQL 가이드

소개: 오라클에 익숙한 개발자들이 큐브리드에 적응 할 수 있도록 작성된 문서 입니다.

2009-01-29 고객지원팀 권성준 version 1.0 CUBRID

2009-03-31컨설팅팀 우광명 version 1.1 CUBRID

적용 대상: CUBRID7.3 이상 , 오라클 8i 이상

개요

본 문서는 오라클을 사용해 본적이 있는 개발자가 큐브리드에 쉽게 적응 할 수 있도록 도와 줄 수 있게끔 간략한 차이점을 문서로 만든 것입니다.

현재 문서의 상태는 모든 것을 비교 하고 있지는 않습니다. 앞으로 계속 자주 사용되는 패턴이 발생되면 추가적으로 업데이트 할 것입니다.

샘플 데이터 준비

샘플 데이터는 두 DB모두 동일한 구조를 사용 하였다.

주의할 사항은 오라클의 DATE타입은 큐브리드의 TIMESTAMP 로 변환 할 수 있다.

 

 

큐브리드

오라클

DB 구조

create table board_data (

bbs_id integer ,

view_cnt integer ,

title varchar(100),

contents varchar(4000),

reg_user_id varchar(50),

reg_date TIMESTAMP ,

upd_date TIMESTAMP

);

 

ALTER TABLE board_data ADD

  PRIMARY KEY (bbs_id) ;

create table board_data (

bbs_id integer ,

view_cnt integer ,

title varchar(100),

contents varchar2(4000),

reg_user_id varchar(50),

reg_date DATE ,

upd_date DATE

);

 

ALTER TABLE board_data ADD

  PRIMARY KEY (bbs_id) ;

샘플 데이터

insert into board_data values ( 3, 0, '타이틀3','내용3','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

 

insert into board_data values ( 2, 0, '타이틀2','내용2','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

  

insert into board_data values ( 4, 0, '타이틀4','내용4','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

 

commit;

 

insert into board_data values ( 1, 0, '타이틀1','내용1','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

 

 

insert into board_data values ( 10, 0, '타이틀10','내용10','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

 

insert into board_data values ( 11, 0, '타이틀11','내용11','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

  

commit;

 

insert into board_data values ( 9, 0, '타이틀9','내용9','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

 

insert into board_data values ( 8, 0, '타이틀8','내용8','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

 

insert into board_data values ( 7, 0, '타이틀7','내용7','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

  

insert into board_data values ( 6, 0, '타이틀6','내용6','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

commit;

 

insert into board_data values ( 5, 0, '타이틀5','내용5','quark', to_timestamp ( '20090330','YYYYMMDD') , to_timestamp ( '20090330','YYYYMMDD') );

commit;

insert into board_data values ( 3, 0, '타이틀3','내용3','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

 

insert into board_data values ( 2, 0, '타이틀2','내용2','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

  

insert into board_data values ( 4, 0, '타이틀4','내용4','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

 

commit;

 

insert into board_data values ( 1, 0, '타이틀1','내용1','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

 

 

insert into board_data values ( 10, 0, '타이틀10','내용10','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

 

insert into board_data values ( 11, 0, '타이틀11','내용11','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

  

commit;

 

insert into board_data values ( 9, 0, '타이틀9','내용9','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

 

insert into board_data values ( 8, 0, '타이틀8','내용8','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

 

insert into board_data values ( 7, 0, '타이틀7','내용7','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

  

insert into board_data values ( 6, 0, '타이틀6','내용6','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

commit;

 

insert into board_data values ( 5, 0, '타이틀5','내용5','quark', to_date ( '20090330','YYYYMMDD') , to_date ( '20090330','YYYYMMDD') );

commit;

 


Pattern 1. ROWNUM Pseudocolumn(의사 컬럼) Top-N query

웹 개발 시 가장 많이 사용하는 SQL패턴이 페이징 및 목록을 구성하는 SQL일 것이다 첫 번째 패턴으로 오라클에서 가장 자주 사용하는 일반적인 SQL을 샘플로 하였다.

 

·          큐브리드 정의

SELECT 문에 ORDER BY 절이 포함된 경우 WHERE절에 명시된 ROWNUM 의사 컬럼의 값은 ORDER BY 절 처리를 위한 정렬 과정 전에 생성된다. SELECT 문에 GROUP BY 절이 포함된 경우에는 HAVING 절에 명시된 GROUPBY_NUM() 함수의 값은 질의 결과가 그룹화된 이후에 계산된다. ORDER BY 절에 의한 정렬 과정이 완료된 이후에 결과 튜플의 일련 번호를 얻어내기 위해서는 ORDER BY 절에 ORDERBY_NUM() 함수를 사용해야 한다.

·         오라클 정의

If you embed the ORDER BY clause in a subquery and place the ROWNUM condition in the top-level query, then you can force the ROWNUM condition to be applied after the ordering of the rows.

 

간략히 말하면 큐브리드는 scan 하는 시점에 ordering을 하고 오라클은 결과셋을 만든 다음 ordering을 한다.


 

예제1.

큐브리드

오라클

비고

select a.*, rownum

 from (

             select bbs_id, title, contents, reg_user_id , rownum rnum

               from board_data

              order by bbs_id desc

                              ) a

where rownum between 1 and 5;

select a.*, rownum

 from (

             select bbs_id, title, contents, reg_user_id , rownum rnum

               from board_data

              order by bbs_id desc

                              ) a

where rownum between 1 and 5;

사용X

데이터scan에 따라서 다른 결과를 낳음

select b.*, rownum

  from ( select rownum rnum , a.*

from (select bbs_id, title, contents, reg_user_id

                     from board_data

                  order by bbs_id desc

                     ) a

             ) b

where rnum between 1 and 5

select b.*, rownum

  from ( select rownum rnum , a.*

from (select bbs_id, title, contents, reg_user_id

                     from board_data

                  order by bbs_id desc

                     ) a

             ) b

where rnum between 1 and 5

사용X

데이터scan에 따라서 다른 결과를 낳음

select bbs_id, title, reg_date

from board_data

order by bbs_id desc for orderby_num() between 1 and 5

select b.*, rownum

  from ( select rownum rnum , a.*

from (select bbs_id, title, contents, reg_user_id

                     from board_data

                  order by bbs_id desc

                     ) a

             ) b

where rnum between 1 and 5

사용 O

큐브리드 권고 사항

 

 


Pattern 2. Implicit (묵시적인) and Explicit(명시적인) Data Conversion

 

오라클의 경우 SQL 안에서 묵시적인 cast 연산을 지원 한다..

하지만 큐브리드의 경우 오라클과 같이 명시적으로 혹은 묵시적으로 SQL안에서 Data conversion을 하지 않는다

오라클에서 지원하는 Data Conversion은 다음의 URL에서 확인 가능하다

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements002.htm#i55214

 

Create Table Temp_table { Int_column Integer };

 

예제1.

Insert into Temp_table values(123);                 Cubrid, Oracle 둘 다 사용가능

Insert into Temp_table values( ‘123’ );             Oracle       에서만 사용가능

Insert into Temp_table values( ‘123’ );             Cubrid 는 사용불가 Data Conversion을 명시적으로 해주어야함

 

예제2.

Select nvl(max(Int_column), 0)  from Temp_table;              Cubrid, Oracle 둘 다 사용가능

Select nvl(max(Int_column, ‘0’ ) from Temp_table;              Oracle       에서만 사용가능

Select nvl(max(Int_column, ‘0’ ) from Temp_table;              Cubrid 는 사용불가 Data Conversion을 명시적으로 해주어야함

 


Pattern 3. 날짜 타입의 차이점 및 사용법

오라클에서 의미 하는 날짜 관련 type과 큐브리드에서 의미 하는 날짜 관련 type은 많이 다르다.

다음의 표에서 유사점과 차이점을 비교 하도록 하겠다

 

큐브리드

오라클

지원여부

비고

지원 하는 날짜-시간 타입

DATE

DATE

O

오라클 DATE와 큐브리드 DATE 타입은 다르다. 오라클의 경우 시분초 정보도 같이 표시 된다.

TIME

 

O

오라클에서 지원하지 않는다.

TIMESTAMP

DATE

O

두가지 타입의 의미는 같지만 지원하는 범위는 다르다.

큐브리드의 경우 GMT 1970 1 1 000초부터 2038 1 19 031407초까지라는 점이다.

 

TIMESTAMP

X

큐브리드에서 지원 하지 않는다.

 

INTERVAL YEAR, DAY

X

큐브리드에서 지원 하지 않는다.

지원 하는 연산

SELECT SYSTIMESTAMP – 3600*24 FROM DB_ROOT;

 

SELECT SYSDATE -1 FROM DUAL;

 

날짜와 관련된 연산을 하는경우 오라클은 일단위 큐브리드는 초단위 연산을 한다.

지원 하는 Data Conversion

큐브리드에서는 명시적으로 cast function을 사용하여 타입변환을 해주어야 한다.

오라클의 경우 묵시적인 형변환을 해준다.

 

 


 

예제1.

Select sysdate -1 from dual;                         Oracle

Select systimestamp – 3600*24 from db_root ;                Cubrid

 

 

Create Table Temp_Table{ Date_column Date, Time_column Time, Timestamp_column Timestamp}

예제2

Select * from Temp_Table where months_between(sysdate, Timestamp_column);                 Oracle

Select * from Temp_Table where months_between(cast(systimestamp as date), cast(Timestamp_cokumn as date)); Cubrid

months_between 함수는 date type parameter로 가진다. Oracle은 입력 데이터의 type을 자동으로 DATE type으로 변환시켜주지만, Cubrid cast를 통해 변환을 시켜주어야 한다.

 

 

 

 

 

 


Pattern 4. 함수의 사용법

예제 1.

select sum(count(access_id)) from game_access group by access_id                                     Oracle

select sum(cnt) from (select count(access_id) as cnt from game_access group by access_id) a    Cubrid

Cubrid Oracle처럼 집계함수를 중복하여 사용할 수 없다. 중복하여 사용하고 싶다면, from절에 sub-query로 나눠서 사용해야 한다.

 

Pattern 5. Cubrid Oracle의 문법적 차이.

예제1.

Delete from Temp_Table;                             Cubrid, Oracle

Delete Temp_Table;                     Oracle

Oracle Delete Delete from을 모두 사용할 수 있지만, Cubrid Delete만 사용할 수 있다.

 

예제 2

Select * from Temp_Table order by dbms_random.value;   Oracle

Select * from Temp_Table order by random();                 Cubrid

Oracle dbms_random.value 함수를 대신하여, Cubrid에서는 random()함수를 제공하고 있다.

 

예제 3.

Select count(column1) from Temp_Table order by column2;                              Oracle 만 사용가능

Select count(column1) from Temp_Table;                                        Cubrid, Oracle

 


Pattern 6. Cubrid OracleExpression의 차이

예제 1.

Select * from Temp_Table where column != 123;              Oracle

Select * from Temp_Table where column <> 123;             Cubrid

Oracle Not Equal 표현인 != 대신에 Cubrid에서는 <>를 제공한다.

예제 2.

Insert into Temp_Table values (123, ‘’ );           Oracle

Insert into Temp_Table values(123, null);          Cubrid, Oracle

DATE type에서는 ‘’ null이 동일하지 않다.

예제 3.

Select column as month from Temp_Table;                     Oracle

Select column as “month” from Temp_Table                   Cubrid

Cubrid Oracle은 예약어의 종류가 다르다. 또한, Cubrid는 테이블 명을 예약어로 사용하고 싶을 때에는 더블 쿼트 “” 를 꼭 사용하여야 한다.

Pattern 7. 오라클만 지원하는 기능

 

큐브리드

오라클

비고

Analytic function

지원X

 

기능에 따라서 구현 가능

WITH clause

지원X

 

 

TEMP TABLE

지원X

 

 

Procedure/Function/Package

큐브리드의 경우 Java Stored Procedure를 지원함

PL/SQL

SQLJ

 

 

예제 1. Analytic Function rank() 사용

select rank() over (order by score desc) as cnt, userid, score, datetime

FROM game_rank WHERE ROWNUM <= 150 -> 오라클만 사용가능

 

SELECT rownum as cnt , userid, score, datetime FROM (

select userid, score, datetime FROM game_rank order by score desc

) V WHERE rownum <= 150 -> 큐브리드 , 오라클 모두 사용가능

 


Pattern 8. 큐브리드만 지원하는 기능

인터넷 서비스에 최적화된 큐브리드는 클릭 카운터라는 기능을 제공 한다.

 

INCR 함수는 SELECT 절에 포함되어 인자로 주어진 컬럼의 값을 1 증가시켜 주는 기능을 합니다. DECR 함수는 해당 컬럼의 값을 1 감소시킨다.

.

예제 1.

SELECT content, INCR(view_cnt) FROM board_data WHERE bbs_id = 1; CUBRID

 

SELECT content, view_cnt FROM board_data WHERE bbs_id = 1;

UPDATE board_data set

View_cnt = view_cnt +1

WHERE bbs_id = 1 ; ORACLE

 

  • ?
    cyberhoon 2009.12.17 20:54
    본문 오류 발견

    Pattern 5. Cubrid와 Oracle의 문법적 차이.
    Cubrid는 Delete만 사용할 수 있다. --> Cubrid는 Delete from 만 사용할 수 있다.


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
165 기타 트랜잭션과 LOCK 초급과정 정만영 2010.07.01 20733
164 기타 큐브리드10.1 에서 윤초 지원 옵션 사용하기 최광일 2017.09.13 984
163 기타 콘솔에서 마이그레이션 하기. file 권호일 2015.06.19 13018
162 기타 조인 방법(Join Method) 설명 file 웁쓰 2009.12.31 27668
161 기타 제로보드 XE 사용하기 file admin 2008.11.21 32919
160 기타 자주 발생하는 큐브리드(cubrid) 에러 메시지 정리 admin 2011.07.14 78429
159 기타 자동증가 속성 사용 방법 및 주의 사항 남재우 2010.02.26 33821
158 Windows 윈도우즈 환경에서 배치화일을 이용하여 백업 또는 데이터베이스 정리 수행하기 남재우 2010.03.03 27370
157 기타 오래 걸리는 질의 및 동일 시간에 수행 중인 질의 추출하기 손승일 2009.05.26 19941
» 기타 오라클 개발자를 위한 CUBRID 개발 안내 1 admin 2009.04.01 49529
155 기타 예제로 배우는 CUBRID 스터디 문학청년 2009.12.29 18099
154 기타 에러 메시지(error) 설명 및 조치 가이드 file CUBRID_DEV 2009.07.11 23137
153 기타 알고 보면 쉬운 cubrid lockdb 유틸리티 file 김승훈 2015.12.08 10055
152 기타 시스템 카다로그 2 admin 2008.11.21 22312
151 기타 스칼라 서브쿼리 사용 가이드 웁쓰 2009.12.31 27890
150 기타 서비스 오픈을 위한 CUBRID 구성 가이드 손승일 2009.11.28 23143
149 Linux 복제 따라하기 admin 2008.11.21 28975
148 기타 보안 설정 admin 2008.11.21 22817
147 기타 멀티미디어 데이터 관리를 위한 CUBRID GLO Method 활용 janus 2009.12.11 16176
146 Linux 리소스를 제한(limits.conf) 하여 DB서버를 관리하자 1 주현 2015.12.31 19147
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2147 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales