Background Image
조회 수 49817 추천 수 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
번호 분류 제목 글쓴이 날짜 조회 수
46 CCI/DB API CCI-API 에서 OID 사용 예제 file 남재우 2009.07.01 24861
45 CCI/DB API CCI-API 사용 예제 file 남재우 2009.07.01 25103
44 PHP CUBRID_기술문서_CUBRID PHP 함수 unisql_ 계열 cubrid_로 변환하기 file 남재우 2009.06.23 22355
43 PHP cubrid_fetch_all 함수 추가하기 2 남재우 2009.06.16 20828
42 기타 Oracle의 SYS_CONNECT_BY_PATH 함수 흉내내기 CUBRID_DEV 2009.06.15 26526
41 Java CUBRID에서 log4sql을 사용하자 정병주 2009.06.12 44302
40 기타 오래 걸리는 질의 및 동일 시간에 수행 중인 질의 추출하기 손승일 2009.05.26 20058
39 Java jsp용 jdbc 샘플입니다. file 시난 2009.05.25 47606
38 Java iBATIS framework with CUBRID file 웁쓰 2009.05.19 54546
37 기타 CUBRID와 타DBMS의 python 사용방법 비교 cubebridge 2009.05.19 29520
36 Java SQuirreL SQL Client에서 CUBRID 사용하기 3 Prototype 2009.04.18 34533
35 Java Power*Architect 에서 CUBRID 사용하기 Prototype 2009.04.18 23879
34 Java AquaDataStudio 에서 CUBRID 사용하기 Prototype 2009.04.18 23666
33 Install CUBRID Manager 사용시 로그인에 대하여 1 file admin 2009.04.01 42038
32 Java Spring framework 사용 예제 admin 2009.04.01 53119
31 기타 connect by 구현 방법 admin 2009.04.01 52371
30 기타 python 에서 broker_log_top 사용 1 admin 2009.04.01 17830
» 기타 오라클 개발자를 위한 CUBRID 개발 안내 1 admin 2009.04.01 49817
28 Linux HP-UX에서 CUBRID 사용을 위한 kernel 설정값 조정 1 admin 2009.04.01 54135
27 Linux cron을 이용한 백업 자동화 admin 2009.04.01 33118
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

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