ALTIBASE 사용자가이드 Templete

Similar documents
ALTIBASE 사용자가이드 Templete

헤르메스 문서

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

목 차

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

13주-14주proc.PDF

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

MS-SQL SERVER 대비 기능

歯sql_tuning2

단답형 (26 회기출문제 ) 1. 아래와같은테이블이있을때아래의 SQL 결과에대해서 Oracle, SQL Server 순서로적으시오 TAB1 COL1 CHAR(10) COL2 CHAR(10) INSERT INTO TAB1 VALUES ('1',''); INSERT INT

Microsoft Word - 04_EXCEPTION.doc

ALTIBASE HDB Patch Notes

ALTIBASE 사용자가이드 Templete

Jerry Held


PowerPoint Presentation

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT

SQL Tuning Business Development DB

객관식 1. 아래의쿼리를만족하는결과를가장잘설명한것은? SELECT A.* FROM HR.EMPLOYEES A, HR.EMPLOYEES B WHERE 1=1 AND A.MANAGER_ID = B.EMPLOYEE_ID AND B.SALARY >= ANY A.SALARY;

´ÙÁß Row °á°ú¸¦ ´ÜÀÏÇàÀ¸·Î Äĸ¶·Î ºÐ¸®ÇØ Ãâ·ÂÇÏ´Â ¹æ¹ý

FlashBackt.ppt

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

강의 개요

Tablespace On-Offline 테이블스페이스 온라인/오프라인

ePapyrus PDF Document

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUER

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

Microsoft PowerPoint - Oracle Data Access Pattern.ppt

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

DBMS & SQL Server Installation Database Laboratory

untitled

untitled

문서 템플릿

Oracle Database 10g: Self-Managing Database DB TSC

Microsoft Word - SQL튜닝_실습교재_.doc

歯PLSQL10.PDF

<4D F736F F D203033C6C4C6BCBCC72DB8AEBFC0B1D7B9E6B9FD2E646F63>

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

Simplify your Job Automatic Storage Management DB TSC

最即時的Sybase ASE Server資料庫診斷工具

세미나(장애와복구-수강생용).ppt

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

1217 WebTrafMon II

PowerPoint Presentation

슬라이드 1

PowerPoint Presentation

90

TITLE

Remote UI Guide

Document Control Change Reason Date Author Change Reference JHJEONG Created Reviews Date Name (Position) Distribution Name Locatio

ESQL/C

ALTIBASE HDB Patch Notes

10.ppt

MySQL-.. 1

Microsoft Word - [Unioneinc] 특정컬럼의 통계정보 갱신_ _ldh.doc

ALTIBASE HDB Patch Notes

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

Microsoft Word - 05_SUBPROGRAM.doc

chap 5: Trees

ALTIBASE 사용자가이드 Templete

Microsoft PowerPoint - 10Àå.ppt

배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 (

6장. SQL

ORACLE-SQL

Microsoft PowerPoint - Oracle Data Join Method.pptx [읽기 전용]

USER GUIDE

예제소스는 에서다운로드하여사용하거나툴바의 [ 새쿼리 ]( 에아래의소스를입력한다. 입력후에는앞으로실습을위해서저장해둔다. -- 실습에필요한 Madang DB 와 COMPANY DB 를모두생성한다. -- 데이터베이스생성 US

ETL_project_best_practice1.ppt

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

DocsPin_Korean.pages

Microsoft Word - 기술노트[19회] Flashback.doc

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Orcad Capture 9.x

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

62

PRO1_02E [읽기 전용]

PowerChute Personal Edition v3.1.0 에이전트 사용 설명서

Tibero

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

Microsoft Word - PLSQL.doc

Microsoft PowerPoint - ch07 - 포인터 pm0415

대량의 DML 작업에대한성능개선방안 엑셈컨설팅본부 /DB 컨설팅팀박준연 개요 대량의데이터를변경해야하는작업은그자체만으로도큰부담으로다가온다. 하지만변경작업자체에만국한되는것이아니라변경되기전데이터와변경이후데이터를각각저장관리해야하는메커니즘이라면성능을개선해야하는입장에서는더욱큰부담

제목을 입력하세요.

Microsoft PowerPoint - Tech-iSeminar_Managing_Tablespace.ppt

결과보고서

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

휠세미나3 ver0.4

슬라이드 제목 없음

윈백및업그레이드 Tibero Flashback 가이드

초보자를 위한 분산 캐시 활용 전략

오라클 데이터베이스 10g 핵심 요약 노트

슬라이드 1

The Self-Managing Database : Automatic Health Monitoring and Alerting

VOL /2 Technical SmartPlant Materials - Document Management SmartPlant Materials에서 기본적인 Document를 관리하고자 할 때 필요한 세팅, 파일 업로드 방법 그리고 Path Type인 Ph

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

[ 목차 ] 5.1 데이터베이스프로그래밍개념 5.2 T-SQL T-SQL 문법 5.3 JAVA 프로그래밍 2

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Transcription:

Real Alternative DBMS ALTIBASE, Since 1999 ORACLE to ALTIBASE 변환가이드 ALTIBASE 5.5 Copyright c 2000~2013 ALTBASE Corporation. All Rights Reserved.

Document Control Change Record Date Author Change Reference 2010-03-26 snkim Created 2011-07-26 Lim272 Modified 2011-08-01 snkim Modified Reviews Date Name (Position) 2010-04-27 leekmo(sp), lim272(sp), okseop7(ts), wlgml337(tc) Distribution Name Location ORACLE to ALTIBASE 변환가이드 2 page of 37

목차 개요... 4 OBJECT 변환... 5 DATATYPE... 5 OBJECT 비교... 6 CREATE TABLESPACE... 7 CREATE TABLE... 9 CREATE INDEX... 14 CREATE VIEW... 16 CREATE TRIGGER... 16 CREATE SEQUENCE... 17 CREATE SYNONYM... 17 ALTER TABLE... 17 SQL 변환... 18 OUTER JOIN... 18 RANK 관련함수... 20 계층형질의... 23 ROLLUP & CUBE... 26 GRANT 구문... 28 STORED PROCEDURE/FUNCTION 변환... 29 일반사항비교... 29 파일및출력처리... 31 TYPE 과 TYPESET... 32 REF CURSOR... 32 WHERE CURRENT OF 구문... 33 EXCEPTION... 34 DATA MIGRATION... 36 DATA MIGRATION 방법... 36 ORACLE to ALTIBASE 변환가이드 3 page of 37

개요 본문서는 ORACLE 에서 ALTIBASE 로변환할때고려할사항과변환방법에대해설명한다. ORACLE 10g 와 ALTIBASE 5.5 버전을대상으로한다. 아래문서를사전에참고할것을권장한다. ALTIBASE, ORACLE 비교자료 ORACLE to ALTIBASE 변환가이드 4 page of 37

OBJECT 변환 ORACLE 의 OBJECT 를 ALTIBASE 로변환할때고려할사항에대해기술한다. DATATYPE ORACLE 의 TABLE 을 ALTIBASE 로변환할때각각의 DATATYPE 을어떻게변환하는지에대해설명한다. 분류 ORACLE ALTIBASE 비고 CHAR CHAR 최대 32K VARCHAR2, VARCHAR VARCHAR2, VARCHAR 최대 32K. DESC 로조회시 VARCHAR 로조회 문자타입 NCHAR NCHAR 문자길이최대 16000B(UTF16), 문자길이최대 10666B(UTF8) NVARCHAR2 NVARCHAR 문자길이최대 16000B(UTF16), 문자길이최대 10666B(UTF8) LONG CLOB 최대 2G LOB 타입 숫자타입 BLOB BLOB 최대 2G CLOB CLOB 최대 2G NCLOB CLOB 최대 2G NUMERIC(p, s) NUMERIC(p, s) 데이터가 SMALLINT, NUMBER (p, s) NUMBER(p, s) DECIMAL(p, s) DECIMAL(p, s) FLOAT(p), BINARY_FLOAT FLOAT(p) INTEGER, BIGINT, REAL, DOUBLE 등 native type 으로지정가능하다면 native type 으로지정하는것이좋다. 데이터처리시변환비용에따른 overhead 를줄일수있고, 저장공간의효율성이좋아지기때문이다. SMALLINT SMALLINT 2 byte 정수형타입 INT INTEGER 4 byte 정수형타입 REAL REAL 4 byte 실수형타입 BINARY_DOUBLE DOUBLE 8 byte 실수형타입 날짜타입 DATE INTERVAL YEAR TO MONTH DATE ALTIBASE DATE 타입은 ORACLE DATE 타입의표현범위를포함 - 지원안됨 ORACLE to ALTIBASE 변환가이드 5 page of 37

분류 ORACLE ALTIBASE 비고 INTERVAL DAY TO SECOND TIMESTAMP WITH TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE - - - TIMESTAMP DATE ORACLE TIMESTAMP(fractional second precision) 타입의 fractional second precision 의값은 0~9 까지표현가능하지만, ALTIBASE DATE 타입은 microsecond 까지표현이가능하다. 즉, ALTIBASE 의 DATE 타입은 ORACLE 의 TIMESTAMP(6) 과같다. 이진타입 BFILE RAW (size) LONG RAW BLOB BLOB BLOB 최대 2G OBJECT 비교 ORACLE ALTIBASE CLUSTER CONSTRAINT DATABASE LINK 지원하지않음 CHECK 는지원하지않음. 그외모두지원 지원하지않음 DATABASE TRIGGER 지원. (BEFORE UPDATE 및 DDL TRIGGER 는지원하지않음 ) DIMENSION EXTERNAL PROCEDURE LIBRARY INDEX-ORGANIZED TABLE INDEX INDEXTYPE JAVA 관련객체 지원하지않음 지원하지않음 지원하지않음 BTREE, RTREE 만지원. BITMAP, CLUSTER, Function based, Global partitioned INDEX 는지원하지않음 지원하지않음 지원하지않음 ORACLE to ALTIBASE 변환가이드 6 page of 37

MATERIALIZED VIEW/ MATERIALIZED VIEW LOG OBJECT TABLE OBJECT TYPE OBJECT VIEW OPERATOR PACKAGE SEQUENCE STORED FUNCTION/PROCEDURE SYNONYM TABLE VIEW CONTEXT DIRECTORY PARAMETER FILE PROFILE ROLE TABLESPACE USER 지원하지않음 지원하지않음 지원하지않음 지원하지않음 지원하지않음 지원하지않음 지원 지원 지원 지원 지원. view 를통해 DML 불가 지원하지않음 지원 객체로서지원하지않음. altibase.properties 파일로지원 지원하지않음 지원하지않음 DATA TABLESPACE, TEMPORARY TABLESPACE 지원. UNDO TABLESPACE 는 ALTIBASE 에서자동으로 1 개만생성하며사용자가생성할수없다. 지원. USER 생성시 CREATE SESSION 권한과객체를생성할수있는권한이자동으로부여 CREATE TABLESPACE ORACLE 의 TABLESPACE 는모두 DISK TABLESPACE 이다. 따라서 ALTIBASE 로변환할때 CREATE DISK DATA TABLESPACE 구문을이용해야한다. 이때, DISK DATA 를생략해도 default 로 DISK TABLESPACE 가생성되므로 CREATE TABLESPACE 구문으로도변환이가능하다. 다음은 ORACLE 의 TABLESPACE 를 ALTIBASE 로변환할때 CREATE TABLESPACE 구문에서지정하는여러옵션들의변환가이드를설명한것이다. 1. DATA TABLESPACE ORACLE 의 DATA TABLESPACE 는모두 DISK TABLESPACE 이다. ALTIBASE 는 CREATE TABLESPACE 구문을이용하여 TABLESPACE 를생성하면 DISK TABLESPACE 로생성되므로 ORACLE 과동일한 CREATE TABLESPACE 구문으로 ORACLE to ALTIBASE 변환가이드 7 page of 37

변환이가능하다. 다음은 ORACLE 의 TABLESPACE 를 ALTIBASE 로변환할때 CREATE TABLESPACE 구문에서지정하는여러옵션들의변환가이드를설명한것이다. ORACLE ALTIBASE 비고 BIGFILE SMALLFILE - ALTIBASE는지원하지않으므로 변환시해당옵션삭제 DATAFILE file specification DATAFILE file specification MINIMUM EXTENT - BLOCKSIZE - LOGGING NOLOGGING - FORCE LOGGING - DEFAULT storage 구문 - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 ONLINE OFFLINE - EXTENT MANAGEMENT LOCAL DICTIONARY SEGMENT SPACE MANAGEMENT AUTO MANUAL SEGMENT MANAGEMENT AUTO MANUAL - FLASHBACK ON OFF - ALTIBASE는지원하지않으므로 변환시해당옵션삭제 1.1 DATA TABLESPACE 변환예제 1.1.1 ORACLE CREATE TABLESPACE TESTDATA DATAFILE 'testdata01.dbf' SIZE 1024M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED LOGGING ONLINE EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT MANUAL FLASHBACK ON; 1.1.2 ALTIBASE CREATE TABLESPACE TESTDATA DATAFILE 'testdata01.dbf' SIZE 1024M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED SEGMENT MANAGEMENT MANUAL; ORACLE to ALTIBASE 변환가이드 8 page of 37

1. SEGMENT MANAGEMENT MANUAL SEGMENT 절은 SEGMENT MANAGEMENT AUTO MANUAL 절로수정하고그외의모든절은지원하지않으므로삭제 2. TEMPORARY TABLESPACE ALTIBASE 는 ORACLE 과마찬가지로 CREATE TEMPORATY TABLESPACE ~ TEMPFILE 구문으로 TEMPORARY TABLESPACE 를생성한다. 다만생성시다음의옵션은지원하지않으므로삭제해야한다. ORACLE ALTIBASE 비고 TABLESPACE GROUP - EXTENT MANAGEMENT LOCAL DICTIONARY - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 2.1 TEMPORATY TABLESPACE 변환예제 2.1.1 ORACLE CREATE TEMPORARY TABLESPACE tbs_temp_02 TEMPFILE 'temp02.dbf' SIZE 5M AUTOEXTEND ON TABLESPACE GROUP tbs_grp_01; 2.1.2 ALTIBASE CREATE TEMPORARY TABLESPACE tbs_temp_02 TEMPFILE 'temp02.dbf' SIZE 5M AUTOEXTEND ON; TABLESPACE GROUP 절은지원하지않으므로삭제 3. UNDO TABLESPACE ALTIBASE 는 UNDO TABLESPACE 를사용자가생성할수없다. ALTIBASE 가기본적으로제공하는 SYS_TBS_DISK_UNDO TABLESPACE 만사용할수있다. CREATE TABLE ORACLE의 TABLE을 ALTIBASE로변환할때 CREATE TABLE 시사용한여러옵션을알맞게변경해야한다. ALTIBASE는 TEMPORARY TABLE, OBJECT TABLE, XMLType TABLE을제공하지않는다. ALTIBASE 는메모리 TABLE 을제공한다. 따라서변환할 TABLE 의특성을잘파악하여메모리 TABLE 을생성한다면메모리 TABLESPACE 를지정하여생성해야한다. 만약메모리 TABLE 을생성한다면 ORACLE 에서사용했던 CREATE TABLE 구문에사용한옵션들을사용할수없다. 메모리 TABLE 생성구문은 ALTIBASE 의 SQL 관련매뉴얼을참조하면된다. ORACLE to ALTIBASE 변환가이드 9 page of 37

ORACLE 의 TABLE 을 DISK TABLE 로변환하고자한다면, CREATE TABLE 시설정할수있는여러옵션을다음과같이 ALTIBASE 에맞게변환해야한다. 또한, ALTIBASE TABLE 생성시 segment 관련내용을지정할경우에는 TABLESPACE 지정 -> PCTFREE/PCTUSED 지정 -> INITRANS/MAXTRANS 지정 -> Storage 절 -> logging 절순으로지정해줘야한다. 1. COLUMN DEFINITION 절 ORACLE ALTIBASE 비고 SORT - ALTIBASE는지원하지않으므로 변환시해당옵션삭제 DEFAULT DEFAULT ENCRYPT - ALTIBASE는지원하지않으므로 변환시해당옵션삭제 Constraint 구문 Constraint 구문 ALTIBASE는 CHECK를제외한 Constraint를제공. 따라서 CHECK는변환시삭제하고 application에서대체. ALTIBASE 는 Constraint 지정시 ENABLE/DISABLE 옵션, references 절의 ON DELETE SET NULL(ON DELETE CASCADE 는지원 ) 옵션을제공하지않으므로삭제. ALTIBASE 는 PRIMARY KEY, UNIQUE 지정시 using index 절에는 tablespace 절, parallel 절, logging 절, force 절만지정가능하다. 즉 index 이름및 create index 절은제공하지않는다. Ref Constraint 구문 - ALTIBASE는 REF컬럼을지원하지 않으므로변환시해당옵션삭제 ORGANIZATION - CLUSTER - COMPRESS NOCOMPRESS - ALTIBASE는지원하지않으므로변환시해당옵션삭제 Column 의크기지정시 BYTE 키워드명시가능 Column 의크기지정시 BYTE 키워드제공하지않음 ORACLE 은 column 의크기지정시 BAYE 키워드를명시할수있지만, ALTIBASE 는크기지정시 BYTE 를제공하지않음. ex) ORACLE : c1 VARCHAR2(10 BYTE) => ALTIBASE : c1 VARCHAR2(10) PRIMARY KEY, UNIQUE Constraint 을지정할때 USING INDEX 절을이용하여 INDEX 속성을지정할때 ALTIBASE 는 TABLESPACE 절, ORACLE to ALTIBASE 변환가이드 10 page of 37

PARALLEL/NOPARALLEL 절, LOGGING/NOLOGGING 절만지정이가능하다. 즉 storage 관련속성은지정할수없다. 2. SEGMENT ATTRIBUTES 절 ORACLE ALTIBASE 비고 TABLESPACE PCTFREE PCTUSED INITRANS TABLESPACE PCTFREE PCTUSED INITRANS MAXTRANS MAXTRANS 255 를 120 으로변경한다. ORACLE의 MAXTRANS는 deprecate 되었고, 항상그값은 255 이다. 반면에 ALTIBASE의 MAXTRANS 값을최대 120 까지지정할수있기때문에 120 으로변경한다. LOGGING NOLOGGING LOGGING NOLOGGING 3. STORAGE 절 ORACLE ALTIBASE 비고 INITIAL INITEXTENTS bytes -> extent 개수로변경 NEXT NEXTEXTENTS bytes -> extent 개수로변경 MINEXTENTS MAXEXTENTS MINEXTENTS MAXEXTENTS PCTINCREASE - FREELISTS - FREELIST - OPTIMAL - ALTIBASE는지원하지않으므로변환시해당옵션삭제 BUFFER POOL - 4. LOB STORAGE 절 ORACLE ALTIBASE 비고 TABLESPACE TABLESPACE ALTIBASE의 LOB STORAGE절은 TABLESPACE만지정가능 STORAGE - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 CHUNK - ORACLE to ALTIBASE 변환가이드 11 page of 37

PCTVERSION - RETENTION - FREEPOOLS - CACHE - STORAGE IN ROW - LOGGING NOLOGGING LOGGING NOLOGGING 5. TABLE PARTITIONING 절 ORACLE ALTIBASE 비고 PARTITION BY RANGE PARTITION BY HASH PARTITION BY LIST Composite partitioning 구문 PARTITION BY RANGE PARTITION BY HASH PARTITION BY LIST - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 6. TABLE PROPERTIES 절 ORACLE ALTIBASE 비고 ENABLE DISABLE ROW MOVEMENT NOPARALLEL PARALLEL ENABLE DISABLE ROW MOVEMENT NOPARALLEL PARALLEL Partitioned TABLE 에만지원 ENABLE DISABLE VALIDATE NOVALIDATE - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 7. TABLE 변환예제 7.1 ORACLE 다음은 ORACLE에서 EMP 테이블을생성하는스크립트이다. CREATE TABLE "SCOTT"."EMP" ( "EMPNO" NUMBER(4,0), "ENAME" VARCHAR2(10 BYTE), "JOB" VARCHAR2(9 BYTE), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), ORACLE to ALTIBASE 변환가이드 12 page of 37

"COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" ENABLE, CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" ; 7.2 ALTIBASE 위의 ORACLE 의 EMP 테이블을 ALTIBASE 에서생성하기위해서는다음과같이생성스크립트를변환해야한다. CREATE TABLE "SCOTT"."EMP" ( "EMPNO" NUMBER(4,0), ) "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), "COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO") USING INDEX TABLESPACE "USERS", CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "SCOTT"."DEPT" ("DEPTNO") TABLESPACE "USERS" PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 120 STORAGE (INITEXTENTS 1 NEXTEXTENTS 1 MINEXTENTS 1 MAXEXTENTS 2147483645) LOGGING ; 1. "ENAME" VARCHAR2(10 BYTE) BYTE 는삭제 ORACLE to ALTIBASE 변환가이드 13 page of 37

2. USING INDEX TABLESPACE "USERS" PK 지정시 USING INDEX 절에는 TABLESPACE 절, PARALLEL/NOPARALLEL 절, LOGGING/NOLOGGING 절만지정가능하므로 TABLESPACE 절이외의다른옵션은삭제 3. REFERENCES "SCOTT"."DEPT" ("DEPTNO") FK 지정시 ENABLE 옵션은지원하지않으므로삭제 4. PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 120 MAXTRANS 의최대값은 120 이므로 120 으로수정 5. STORAGE (INITEXTENTS 1 NEXTEXTENTS 1 MINEXTENTS 1 MAXEXTENTS 2147483645) INITIAL 과 NEXT 는각각 INITEXTENTS, NEXTEXTENTS 로변경해야하며그값도 extent 의개수로수정 6. TABLESPACE "USERS" PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 120 STORAGE... LOGGING segment 관련내용을지정할경우에는 TABLESPACE 지정 -> PCTFREE/PCTUSED 지정 -> INITRANS/MAXTRANS 지정 -> Storage 절 -> logging 절순으로지정 CREATE INDEX ALTIBASE 는 BTREE 와 RTREE INDEX 만제공하고 BITMAP, CLUSTER, Function based, REVERSE, Global partitioned INDEX 를제공하지않는다. 또한, ALTIBASE INDEX 생성시 segment 관련내용지정할경우에는 TABLESPACE 지정 -> PARALLEL/NOPARALLEL 지정 -> LOGGING/NOLOGGING 지정 -> storage 절순으로지정해야한다. 다음은 ALTIBASE 로변환할때 CREATE INDEX 구문에사용하는옵션들에대한변환방법이다. ORACLE ALTIBASE 비고 TABLESPACE LOGGING NOLOGGING NOPARALLEL PARALLEL TABLESPACE LOGGING NOLOGGING NOPARALLEL PARALLEL COMPUTE STATISTICS - REVERSE - SORT NOSORT - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 ORACLE to ALTIBASE 변환가이드 14 page of 37

ONLINE - COMPRESS NOCOMPRESS - PCTFREE, PCTUSED, - INITRANS MAXTRANS Storage 구문 INITRANS MAXTRANS TABLE 의 Storage 구문과동일 ALTIBASE 는최대 30 까지지원 1. INDEX 변환예제 1.1 ORACLE 다음은 ORACLE에서 INDEX를생성하는스크립트이다. CREATE INDEX "SCOTT"."EMP_IDX1" ON "SCOTT"."EMP" ("DEPTNO", "SAL") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" ; 1.2 ALTIBASE CREATE INDEX "SCOTT"."EMP_IDX1" ON "SCOTT"."EMP" ("DEPTNO", "SAL") TABLESPACE "USERS" INITRANS 2 MAXTRANS 30 STORAGE(INITEXTENTS 1 NEXTEXTENTS 1 MINEXTENTS 1 MAXEXTENTS 2147483645) ; 1. INITRANS 2 MAXTRANS 30 MAXTRANS 는 30 까지지원하므로 30 으로변경 2. STORAGE(INITEXTENTS 1 NEXTEXTENTS 1 MINEXTENTS 1 MAXEXTENTS 2147483645) ; STORAGE 절에는 INITEXTENTS, NEXTEXTENTS, MINEXTENTS, MAXEXTENTS 만지정가능하고, INITIAL 과 NEXT 는각각 INITEXTENTS, NEXTEXTENTS 로변경해야하며그값도 extent 의개수로수정해야함 3. TABLESPACE "USERS" INITRANS 2 MAXTRANS 30 STORAGE... ; segment 관련내용지정할경우에는 TABLESPACE 지정 -> PARALLEL/NOPARALLEL 지정 -> LOGGING/NOLOGGING 지정 -> storage 절순으로지정 ORACLE to ALTIBASE 변환가이드 15 page of 37

CREATE VIEW ALTIBASE 는 Materialized-view 와 DML 이가능한 Updatable-view (INSERT, UPDATE, DELETE 를수행할수있는 view) 를제공하지않는다. ALTIBASE 의 VIEW 는 ORACLE 의 VIEW 생성구문과동일하게 CREATE OR REPLACE VIEW 구문으로생성한다. 따라서큰변환없이 VIEW 를생성할수있다. 하지만, 다음의옵션들은변환시참고해야한다. ORACLE ALTIBASE 비고 WITH READ ONLY WITH READ ONLY ALTIBASE는 WITH READ ONLY 옵션의 VIEW만제공하므로해당옵션이 default임 [NO] FORCE [NO] FORCE WITH CHECK OPTION - XMLType view 구문 - Object view 구문 - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 CREATE TRIGGER ALTIBASE 의 TRIGGER 는 BEFORE UPDATE TRIGGER 및 DDL TRIGGER 를제공하지않는다. 또한 TRIGGER 의 DML 이벤트를 OR 연산을이용하여여러개를나열할수없다. 따라서각각의 DML 이벤트에대한 TRIGGER 를별도로생성해야한다. 그리고, ALTIBASE 는 TRIGGER 대상 TABLE 에 LOB 컬럼이있으면에러가발생하고 CREATE OR REPLACE TRIGGER 대신 CREATE TRIGGER 구문으로생성해야한다. 다음은 CREATE TRIGGER 시사용하는구문을 ALTIBASE 로변환할때고려해야할사항에대해설명한것이다. ORACLE ALTIBASE 비고 CREATE OR REPLACE TRIGGER BEFORE AFTER INSTEAD OF CREATE TRIGGER BEFORE AFTER OR REPLACE 구문을지원하지않음 ALTIBASE 는 BEFORE UPDATE 와 INSTEAD OF 는지원하지않음 DML 이벤트구문 DML 이벤트구문 ALTIBASE는 OR를이용해여러 DML 이벤트를지정할수없다. DML 이벤트 구문은 ORACLE과동일 DDL 이벤트구문 - ALTIBASE는 DDL TRIGGER를제공하지 않음 WHEN 조건 WHEN 조건 ORACLE to ALTIBASE 변환가이드 16 page of 37

FOR EACH ROW FOR EACH ROW REFERENCING REFERENCING DELETE 이벤트에서 NEW는 REFERENCING 할수없고, INSERT 이벤트에서는 OLD는 REFERENCING 할수없다. OLD/NEW에 alias를줄경우 OLD/NEW는키워드이므로 alias로사용할수없다. Trigger body 구문 Trigger body 구문 ALTIBASE Trigger body 구문은 AS BEGIN 구문으로시작해야한다. 또한 ORACLE의 Trigger body 구문은 DECLARE 절로시작할수있지만, ALTIBASE의 Trigger body는 AS 절에선언부분을지정해야하고, DECLARE 절을명시할수없다. OLD/NEW row 사용시 : 사용할수없다. Ex) :old (x) -> old(o) CREATE SEQUENCE ALTIBASE 의 CREATE SEQUENCE 구문은 ORACLE 과동일하다. 다만, ORACLE 에서제공하는 ORDER, NOORDER 옵션은지원하지않는다. 또한, ORACLE SEQUENCE 의 maxvalue 값은 28 자리정수까지지정할수있지만, ALTIBASE SEQUENCE 의 maxvalue 는 (-9223372036854775807) 부터 9223372036854775806 까지의범위내에서지정할수있다. CREATE SYNONYM ALTIBASE 의 CREATE SYNONYM 구문은 ORACLE 과동일하다. 다만, ORACLE 에서제공하는 OR REPLACE 구문은지원하지않는다. ALTER TABLE ALTIBASE 는 Constraint 추가시한번에 1 개의 Constraint 만추가가능하다. ORACLE 에서 ALTER TABLE ADD (CONSTRAINT constraint_name constraint_type, ); 문으로여러개의 Constraint 를추가하는문장은 Constraint 별로나눠서 ALTER TABLE ADD CONSTRAINT constraint_name constraint_type; 문으로 Constraint 별로나눠서실행해야한다. ORACLE 은 PRIMARY KEY 와 UNIQUE 를지정시 INDEX 를미리생성한후지정이가능하지만, ALTIBASE 는 Constraint 를지정하는시점에내부적으로 INDEX 를생성하기때문에동일컬럼에대해 PK Constraint, UNIQUE Constraint, INDEX 생성중하나만가능하다. 즉, INDEX 를생성한컬럼에 PK Constraint 를지정할수없다. ORACLE to ALTIBASE 변환가이드 17 page of 37

SQL 변환 ORACLE 에서 ALTIBASE 로 SQL 을변환하는방법과고려할사항에대해기술한다. OUTER JOIN ALTIBASE 는 ANSI 표준의 JOIN 연산만제공한다. 따라서 ORACLE 의 (+) 연산자를이용한 JOIN 구문은 ANSI 표준의 JOIN 구문으로변경해야한다. ORACLE 의 (+) 를이용한 JOIN 은 (+) 가없는쪽의 TABLE 이기준 TABLE 이되고 (+) 가있는 TABLE 이 OUTER JOIN 대상이된다. ANSI 표준의 OUTER JOIN 구문은기준 TABLE 이왼쪽에위치하는경우는 LEFT OUTER JOIN, 오른쪽에위치하는경우는 RIGHT OUTER JOIN 을사용한다. 1. 두 TABLE 이한개의컬럼에대해 OUTER JOIN 될경우 1.1 ORACLE 질의 SELECT t1.a, t1.b, t2.a, t2.c FROM test1 t1, test2 t2 WHERE t1.a = t2.a(+); 1.2 ALTIBASE 로변경된질의 SELECT t1.a, t1.b, t2.a, t2.c FROM test1 t1 LEFT OUTER JOIN test2 t2 ON t1.a = t2.a; 혹은, SELECT t1.a, t1.b, t2.a, t2.c FROM test2 t2 RIGHT OUTER JOIN test1 t1 ON t1.a = t2.a; (+) 가없는기준 TABLE(test) 을 LEFT OUTER JOIN 구문왼쪽에위치시키고, 대상 TABLE(test2) 를오른쪽에위치시킨후 JOIN 조건을 ON 절에명시한다. RIGHT OUTER JOIN 을사용할경우에는기준 TABLE(test1) 을 RIGHT OUTER JOIN 구문오른쪽에위치시킨후대상 TABLE(test2) 를왼쪽에위치시키면된다. 2. 기준 TABLE 한개에다수의 TABLE 이 OUTER JOIN 될경우 2.1 ORACLE 질의 SELECT t1.a, t1.b, t3.d, t4.e, t5.f FROM test1 t1, test3 t3, test4 t4, test5 t5 WHERE t1.a = t3.a(+) AND t1.a = t4.a(+) AND t1.a = t5.a(+) ORDER BY t1.a; 2.2 ALTIBASE 로변경된질의 ORACLE to ALTIBASE 변환가이드 18 page of 37

SELECT t1.a, t1.b, t3.d, t4.e, t5.f FROM test1 t1 LEFT OUTER JOIN test3 t3 ON t1.a = t3.a LEFT OUTER JOIN test4 t4 ON t1.a = t4.a LEFT OUTER JOIN test5 t5 ON t1.a = t5.a ORDER BY t1.a; 기준 TABLE(test1) 을 LEFT OUTER JOIN 구문왼쪽에위치시키고, 첫번째 OUTER JOIN 대상 TABLE(test3) 을오른쪽에위치시킨후 JOIN 조건을 ON 절에명시한다. 이후다른대상 TABLE 을차례로 LEFT OUTER JOIN 구문으로동일한형식으로나열한다. 3. 두개의 TABLE 에대해 JOIN 되는컬럼이다수인경우 3.1 ORACLE 질의 SELECT t1.*, t2.* FROM test1 t1, test2 t2 WHERE t1.a= t2.a(+) AND t1.b = t2.b(+) AND t1.c = t2.c(+) AND t1.a = 2 ORDER BY t1.a, t1.b; 3.2 ALTIBASE 로변경된질의 SELECT t1.*, t2.* FROM test1 t1 LEFT OUTER JOIN test2 t2 ON t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c WHERE t1.a=2 ORDER BY t1.a, t1.b; 기준 TABLE(test1) 을 LEFT OUTER JOIN 구문왼쪽에위치시키고, 여러개의 JOIN 조건을 ON 절에 AND 연산자를이용하여명시한다. 만약기타다른조건이있다면 WHERE 절에해당조건을추가해주면된다. 4. OUTER JOIN 과 INNER JOIN 이함께사용된경우 4.1 ORACLE 질의 SELECT t1.*, t2.*, t3.* FROM test1 t1, test2 t2, test3 t3 WHERE t1.a= t2.a AND t2.c= t3.c(+) AND t1.a = 2; 4.2 ALTIBASE 로변경된질의 SELECT t1.*, t2.*, t3.* FROM test1 t1 INNER JOIN test2 t2 ON t1.a = t2.a LEFT OUTER JOIN test3 t3 ON t2.c = t3.c ORACLE to ALTIBASE 변환가이드 19 page of 37

WHERE t1.a = 2; test1 테이블과 test2 테이블은 INNER JOIN 으로연결되고, 이결과에 test3 테이블이 OUTER JOIN 으로연결되기때문에 test1 과 test2 는 INNER JOIN 으로, 이두테이블의 JOIN 결과에 OUTER JOIN 대상이되는 test3 테이블은 LEFT OUTER JOIN 구문오른쪽에위치시킨다. RANK 관련함수 ORACLE 에서제공하는 ROW_NUMER(), RANK(), DENSE_RANK() 는데이터를그룹으로묶고그것에대한순위를정하는함수이다. 5 명의학생에대한성적정보가입력이되어있고 1 등이 2 명이라면위의함수는각각다음의결과를 return 한다. ROW_NUMBER() : 1, 2, 3, 4, 5 RANK() : 1, 1, 3, 4, 5 DENSE_RANK() : 1, 1, 2, 3, 4 ALTIBASE 에서는 RANK(), ROW_NUMBER(), DENSE_RANK() 함수를지원하지않는다. 따라서다음과같은형태로변환해서사용해야한다. 질의를수행하기위해다음의테스트데이터를이용한다. isql> SELECT * FROM emp; ENAME DEPTNO SAL -------------------------------------------------------------- SMITH 20 800 ALLEN 30 1600 WARD 30 1250 JONES 20 2975 MARTIN 30 1250 BLAKE 30 2850 CLARK 10 2450 KING 10 5000 TURNER 30 1500 JAMES 30 950 FORD 20 3000 MILLER 10 1300 SCOTT 20 3000 ADAMS 20 1100 14 rows selected. 1. ROW_NUMER() 1.1 ORACLE 질의 SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) row_num FROM emp; 1.2 ALTIBASE 로변경된질의 SELECT ename, sal, rownum row_num FROM (SELECT ename, sal FROM emp ORDER BY sal DESC ) x -- sal ASC 였다면 ORDER BY sal ASC 로변경 ORACLE to ALTIBASE 변환가이드 20 page of 37

2. ROW_NUMBER() PARTITION BY 2.1 ORACLE 질의 SELECT ename, deptno, sal, ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) FROM EMP; 2.2 ALTIBASE 로변경된질의 SELECT ename, deptno, (rownum - count_row) dense_rank FROM (SELECT a.deptno, a.ename, a.sal, (SELECT COUNT(*) count_row FROM emp b WHERE b.deptno < a.deptno) count_row FROM emp a ORDER BY deptno, sal DESC) x -- sal ASC 였다면 ORDER BY deptno, sal 로변경 ORDER BY deptno, dense_rank; 성능을위해 deptno, sal 컬럼에인덱스를생성해야한다. 3. RANK() 3.1 ORACLE 질의 SELECT ename, sal, RANK() OVER (ORDER BY sal DESC) rank FROM emp; 3.2 ALTIBASE 로변경된질의 SELECT ename, sal, rank FROM (SELECT a.ename, a.sal, (SELECT 1+COUNT(*) FROM emp b WHERE b.sal > a.sal) rank -- sal ASC 였다면 WHERE b.sal < a.sal 로변경 FROM emp a) x ORDER BY x.rank; 성능을위해 sal 컬럼에인덱스를생성해야한다. 4. RANK() PARTITION BY 4.1 ORACLE 질의 SELECT ename, deptno, sal, RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) rank FROM EMP; 4.2 ALTIBASE 로변경된질의 SELECT ename, deptno, sal, rank ORACLE to ALTIBASE 변환가이드 21 page of 37

FROM (SELECT a.ename, a.deptno, a.sal, (SELECT 1+COUNT(*) FROM emp b WHERE b.deptno = a.deptno AND b.sal > a.sal) rank -- sal ASC 였다면 WHERE b.sal < a.sal 로변경 FROM emp a) x ORDER BY x.deptno, x.rank; 성능을위해 deptno, sal 컬럼에인덱스를생성해야한다. 5. DENSE_RANK() 5.1 ORACLE 질의 SELECT ename, sal, DENSE_RANK() OVER (ORDER BY sal DESC) FROM emp; 5.2 ALTIBASE 로변경된질의 SELECT ename, sal, dense_rank FROM (SELECT ename, a.sal, (SELECT 1+COUNT(DISTINCT sal) FROM emp b WHERE b.sal > a.sal) dense_rank -- sal ASC 였다면 WHERE b.sal < a.sal 로변경 FROM emp a) x ORDER BY x.dense_rank; 성능을위해 sal 컬럼에인덱스를생성해야한다. 6. DENSE_RANK() PARTITION BY 6.1 ORACLE 질의 SELECT ename, deptno, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) FROM EMP; 6.2 ALTIBASE 로변경된질의 SELECT ename, deptno, sal, dense_rank FROM (SELECT a.ename, a.deptno, a.sal, (SELECT 1+COUNT(DISTINCT sal) FROM emp b WHERE b.deptno = a.deptno AND b.sal > a.sal) dense_rank -- sal ASC 였다면 WHERE b.sal < a.sal 로변경 FROM emp a) x ORDER BY x.deptno, x.dense_rank; 성능을위해 deptno, sal 컬럼에인덱스를생성해야한다. ORACLE to ALTIBASE 변환가이드 22 page of 37

계층형질의 하나의엔터티가다른엔터티가아닌자기자신과관계를맺는순환관계의모델을가질때, 계층적인순서로결과를조회하도록질의문을제공하는데이때사용하는질의가계층형질의이다. ORACLE에서사용하는 START WITH와 CONNECT BY 절은 ALTIBASE에서도동일하게지원하므로변환없이사용할수있다. 하지만다음의사항을주의해야한다. 1. base TABLE 에대한질의만가능하다. VIEW 와 Inline VIEW 에서는계층형질의를사용할수없다. 사용하게되면다음의에러가발생한다. isql>create VIEW v1 AS SELECT * FROM pc; isql>select LPAD(' ',2*(LEVEL-1)) item_name item_names FROM v1 START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id; ERR-311A1 : A hierarchical query on neither a created view nor inline view is allowed 2. NOCYCLE 절은 IGNORE LOOP 절로변환한다. 2.1 ORACLE 질의 SELECT LPAD(' ',2*(LEVEL-1)) item_name AS item_names FROM pc START WITH parent_id IS NULL CONNECT BY NOCYCLE PRIOR item_id = parent_id; 2.2 ALTIBASE 로변경된질의 SELECT LPAD(' ',2*(LEVEL-1)) item_name AS item_names FROM pc START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id; IGNORE LOOP; 3. ORDER BY SIBILINGS BY 절을지원하지않는다. 4. CONNECT_BY_ROOT, CONNECT_BY_ISLEAF, SYS_CONNECT_BY_PATH, CONNECT_BY_ISCYCLE 는지원하지않는다. ORACLE 10g 에서지원하는 CONNECT_BY_ROOT, CONNECT_BY_ISLEAF, SYS_CONNECT_BY_PATH, CONNECT_BY_ISCYCLE 는 ALTIBASE 에서지원하지않으므로다음과같은형태로변환해서사용해야한다. 질의를수행하기위해다음의테스트데이터를이용한다. isql> SELECT * FROM pc; ITEM_ID PARENT_ID ITEM_NAME ITEM_QTY ORACLE to ALTIBASE 변환가이드 23 page of 37

---------------------------------------------------------------------------------- 1001 Computer 1 1002 1001 BODY 1 1003 1001 monitor 1 1004 1001 printer 1 1005 1002 Mother board 1 1006 1002 Lan card 1 1007 1002 Power Supply 1 1008 1005 RAM 1 1009 1005 CPU 1 1010 1005 Graphic device 1 1011 1005 ETC device 1 11 rows selected. 4.1 CONNECT_BY_ROOT 자신의최상위 ROOT 노드즉, LEVEL 1 에해당하는값을나타내는의사컬럼이다. 4.1.1 ORACLE 질의 SELECT LPAD(' ',2*(LEVEL-1)) item_name AS item_names, CONNECT_BY_ROOT item_id, CONNECT_BY_ROOT item_name FROM pc START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id; 4.1.2 ALTIBASE 로변경된질의 SELECT a.item_names, b.connect_by_root_item_id, b.connect_by_root_item_name FROM (SELECT LPAD(' ',2*(LEVEL-1)) item_name item_names FROM pc START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id) a, (SELECT item_id AS connect_by_root_item_id, item_name AS connect_by_root_item_name FROM pc WHERE LEVEL =1 START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id ) b; 최상위 ROOT 노드에해당하는값을 inline-view 로만들어 cartesian product 연산을수행한다. 4.2 CONNECT_BY_ISLEAF CONNECT_BY_ISLEAF 는자신의 LEAF 노드일경우 ( 자식을갖지않을경우 ) 에 1 을 return 하고그렇지않을경우에 0 을 return 하는의사컬럼이다. 4.2.1 ORACLE 질의 SELECT LPAD(' ',2*(LEVEL-1)) item_name AS item_names, CONNECT_BY_ISLEAF FROM pc START WITH parent_id IS NULL ORACLE to ALTIBASE 변환가이드 24 page of 37

CONNECT BY PRIOR item_id = parent_id; 4.2.2 ALTIBASE 로변경된질의 SELECT a.item_names, DECODE(b.parent_id,NULL,1,0) connect_by_isleaf FROM (SELECT LPAD(' ',2*(level-1)) item_name item_names, item_id FROM pc START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id) a LEFT OUTER JOIN (SELECT DISTINCT parent_id FROM pc) b ON a.item_id = b.parent_id; parent_id 값들을 inline-view 로질의한후이 inline-view 와 outer join 을수행하여 item_id 값이 parent_id 에존재하지않는경우 ( 자식이존재하지않는경우 ) 는 LEAF 노드이므로 1 을리턴하고그렇지않은경우는 0 을리턴한다. 4.3 SYS_CONNECT_BY_PATH ROOT 노드부터해당레코드항목까지의경로 (PATH) 를반환한다. 4.3.1 ORACLE 질의 SELECT LEVEL, SYS_CONNECT_BY_PATH(item_name,'/') FROM pc START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id; 4.3.2 ALTIBASE 로변경된질의 SYS_CONNECT_BY_PATH 에대응하는사용자정의함수를생성한다. CREATE OR REPLACE FUNCTION sys_connect_by_path_pc ( pkey pc.parent_id%type, plevel INTEGER, delim VARCHAR(10) ) RETURN VARCHAR2(200) AS path VARCHAR(200); BEGIN DECLARE CURSOR c1 IS SELECT item_name FROM pc WHERE LEVEL <= plevel START WITH item_id = pkey CONNECT BY PRIOR parent_id=item_id ; BEGIN FOR crec IN c1 LOOP path := delim crec.item_name path; END LOOP; RETURN path; ORACLE to ALTIBASE 변환가이드 25 page of 37

END ; END; / 4.3.3 sys_connect_by_path_pc 함수를호출한다. SELECT LEVEL, SYS_CONNECT_BY_PATH_PC ( item_id, LEVEL, '/' ) FROM pc START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id; 4.4 CONNECT_BY_ISCYCLE 해당레코드의항목이자식노드를갖는데동시에그자식노드가다시부모노드인지판별하는의사컬럼이다. ALTIBASE 는이러한경우무한루프에빠지기때문에다음의오류를 return 한다. [ERR-311A4 : A loop in hierarchical query detected.] 이러한오류가발생하지않게하기위해서는 IGNORE LOOP 절을명시해야한다. SELECT LPAD(' ',2*(LEVEL-1)) item_name AS item_names FROM pc START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id; IGNORE LOOP; ORACLE 의 CONNECT_BY_ISCYCLE 은 ALTIBASE 에서지원하지않는다. ROLLUP & CUBE ROLLUP 과 CUBE 는 GROUP BY 절에사용하여추가적인 grouping 정보를표현하는함수이다. ROLLUP : grouping 된결과에 group 별합계정보를추가한다. CUBE : grouping 된컬럼에대해가능한모든조합의합계정보를추가한다. ALTIBASE 는 ROLLUP 과 CUBE 를지원하지않기때문에다음과같이변환해야한다. 질의를수행하기위해다음의테스트데이터를이용한다. isql> SELECT * FROM tmp_sales; GROUP_ID SALES_EMP SALES_QTY ------------------------------------------------------------------- A test1 5 A test2 10 A test3 1 B test4 10 B test5 5 C test6 50 A test1 5 ORACLE to ALTIBASE 변환가이드 26 page of 37

A test2 10 C test5 5 1. ROLLUP 1.1 ORACLE 질의 SELECT group_id, sales_emp, SUM(sales_qty) FROM tmp_sales GROUP BY ROLLUP(group_id,sales_emp); 1.2 ALTIBASE 로변경된질의 SELECT group_id, sales_emp, SUM(sales_qty) FROM ( SELECT DECODE(no, 1, group_id, 2, group_id) group_id, DECODE(no, 1, sales_emp) sales_emp, sales_qty FROM tmp_sales, (SELECT LEVEL no FROM dual CONNECT BY LEVEL <= 3) copy_t ) GROUP BY group_id, sales_emp ORDER BY 1, 2; 2. CUBE 2.1 ORACLE 질의 SELECT group_id, sales_emp, SUM(sales_qty) FROM tmp_sales GROUP BY CUBE(group_id, sales_emp); 2.2 ALTIBASE 로변경된질의 SELECT NVL(group_id,' '), NVL(sales_emp,' '), Sum(sales_qty) FROM ( SELECT DECODE(no, 1, group_id, 2, group_id) group_id, no, DECODE(no, 1, sales_emp, 4, sales_emp) sales_emp, sales_qty FROM tmp_sales, (SELECT LEVEL no FROM dual CONNECT BY LEVEL <= 4) copy_t ) GROUP BY group_id, sales_emp ORDER BY 1, 2; ORALCE 의 CUBE 실행시 grouping 하는컬럼의값이 null 로나타나지만, 위의변환질의는 null 대신공백 으로나타난다. ORACLE to ALTIBASE 변환가이드 27 page of 37

GRANT 구문 ORACLE 은특정 USER 의 OBJECT 권한을관리자가부여할수있지만, ALTIBASE 는 OBJECT 를소유한 USER 만이부여할수있다. 또한 ALTIBASE 는 ROLE 을제공하지않기때문에 GRANT 구문으로는권한들만부여할수있다. ORACLE to ALTIBASE 변환가이드 28 page of 37

Stored PROCEDURE/FUNCTION 변환 ORACLE 의 Stored PROCEDURE 와 FUNCTION 을 ALTIBASE 로변환할때고려할사항에대해기술한다. 일반사항비교 다음은 Stored PROCEDURE/FUCTION 을작성할때일반적으로고려해야할사항에대해설명한다. 1. ALTIBASE AUTOCOMMIT 모드에서 PROCEDURE 처리 ALTIBASE 가 AUTOCOMMIT 모드일경우 PROCEDURE/FUNCTION 전체가하나의트랜잭션으로처리되고 PROCEDURE 내에서의 COMMIT/ROLLBACK 은무시된다. 또 PROCEDURE/FUNCTION 을실행한후에자동으로 COMMIT 된다. 따라서 PROCEDURE/FUNCTION 에서 DML 문장을실행한후결과가 ALTIBASE 와 ORACLE 이다를수있다. 반대로 ALTIBASE 를 NON- AUTOCOMMIT 모드로적용했다면 ORACLE 의 NON-AUTOCOMMIT 모드와동일한결과가나타난다. 1.1 ORACLE CREATE OR REPLACE PROCEDURE t1_test ( in_t IN INTEGER, in_v IN VARCHAR ) IS BEGIN INSERT INTO t1 VALUES(in_t, in_v); ROLLBACK; END; / EXEC t1_test(4, '000004'); SQL> SELECT COUNT(*) FROM t1; COUNT(*) ----------------- 0 1.2 ALTIBASE CREATE OR REPLACE PROCEDURE t1_test( in_t IN INTEGER, in_v IN VARCHAR(20) ) IS BEGIN INSERT INTO t1 VALUES(in_t, in_v); ROLLBACK; END; / ORACLE to ALTIBASE 변환가이드 29 page of 37

EXEC t1_test(4, '000004'); isql> SELECT COUNT(*) FROM t1; COUNT ------------ 1 2. CURSOR 를 OPEN 한상태에서 COMMIT/ROLLBACK, DDL 문을실행할수없다. 2.1 ORACLE CREATE OR REPLACE PROCEDURE cur_proc1 (in_val IN INTEGER, out_val OUT INTEGER) IS CURSOR cur1 IS SELECT c1 FROM t1 WHERE c1>in_val; col1 INTEGER; r1 INTEGER; BEGIN r1 := 0; OPEN cur1; LOOP FETCH cur1 into col1; EXIT WHEN cur1%notfound; INSERT INTO t2 VALUES(col1); COMMIT; -- 허용됨 r1 := r1+1; DBMS.PUT_LINE(col1); END LOOP; CLOSE cur1; DBMS.PUT_LINE('# of insert: ' r1); out_val := r1; END; / 2.1 ALTIBASE CREATE OR REPLACE PROCEDURE cur_proc1 (in_val IN INTEGER, out_val OUT INTEGER) IS CURSOR cur1 IS SELECT c1 FROM t1 WHERE c1>in_val; col1 INTEGER; r1 INTEGER; BEGIN r1 := 0; OPEN cur1; LOOP FETCH cur1 into col1; EXIT WHEN cur1%notfound; INSERT INTO t2 VALUES(col1); COMMIT; -- (X) r1 := r1+1; PRINTLN(col1); END LOOP; ORACLE to ALTIBASE 변환가이드 30 page of 37

CLOSE cur1; COMMIT; -- (O) PRINTLN('# of insert: ' r1); out_val := r1; END; / 3. PARAMETER 의 TYPE 과 RETURN TYPE 의 CHAR, VARCHAR 는크기도지정 ALTIBASE 에서 PROCEDURE 나 FUCTION 의 PARAMATER 혹은 RETURN TYPE 을 ORACLE 처럼 CHAR, VARCHAR 로선언하면 CHAR(1), VARCHAR(1) 과동일한의미이다. 따라서, 하나의문자가아니라문자열을사용하고자한다면, 반드시그크기를지정해줘야한다. 만약지정해주지않고문자열이 2 문자이상이면다음과같은에러가발생한다. ERR-2100D : Invalid length of the data type 파일및출력처리 ALTIBASE 의파일및출력에관련된 PROCEDURE 는 SYSTEM_ 유저에자동으로생성이되어있고, PUBLIC SYNONYM 으로정의되어있기때문에사용자는 PROCEDURE 이름만호출하여사용할수있다. 다음은 ORACLE 과 ALTIBASE 의파일처리방법을비교한표이다. 구분 ORACLE ALTIBASE 표준출력 파일처리 DBMS_OUTPUT.PUT DBMS_OUTPUT.PUT_LINE UTL_FILE.FOPEN UTL_FILE.FCLOSE UTL_FILE.FCLOSE_ALL UTL_FILE.FCOPY UTL_FILE.FFLUSH UTL_FILE.FREMOVE UTL_FILE.FRENAME UTL_FILE.GET_LINE UTL_FILE.IS_OPEN UTL_FILE.NEW_LINE PRINT PRINTLN FOPEN FCLOSE FCLOSE_ALL FCOPY FFLUSH FREMOVE FRENAME GET_LINE IS_OPEN NEW_LINE ORACLE to ALTIBASE 변환가이드 31 page of 37

TYPE 과 TYPESET ALTIBASE 는 PACKAGE 를지원하지않기때문에사용자정의 TYPE 들을 TYPESET 으로생성하여 PROCEDURE 간의전송수단으로사용할수있다. 따라서 ORALCE 의 CREATE TYPE 문으로생성한사용자정의 TYPE 들을묶어서 CREATE TYPESET 문으로 TYPESET 을생성하여사용할수있다. 다음은 ORACLE 의 TYPE 과 ALTIBASE 의 TYPESET 을생성하는구문이다. 1. ORACLE CREATE TYPE emp_ary AS VARRAY(50) OF VARCHAR2(4000); 2. ALTIBASE CREATE TYPESET typeset_1 AS TYPE emp_rec_type IS RECORD( name VARCHAR(20), job_id VARCHAR(10), salary NUMBER(8)); TYPE emp_arr_type IS TABLE OF emp_rec_type INDEX BY INTEGER; END; / REF CURSOR ORACLE 의 REF CURSOR 는보통 PACKAGE 에선언을하고, 이를 PROCEDURE 의 OUT PARAMATER 로선언하여사용한다. 하지만, ALTIBASE 는 PACKAGE 를제공하지않기때문에 TYPESET 으로생성하여사용해야한다. 다음은 ORACLE 과 ALTIBASE 에서 REF CURSOR 를사용하는예제이다. 1. ORACLE CREATE OR REPLACE PACKAGE ref_cursor_pkg AS TYPE ref_type IS REF CURSOR; PROCEDURE ref_cursor_pro(v_result OUT ref_type, v_sql IN VARCHAR2); END; / CREATE OR REPLACE PACKAGE BODY ref_cursor_pkg AS PROCEDURE ref_cursor_pro(v_result OUT ref_type, v_sql IN VARCHAR2) AS BEGIN OPEN v_result FOR v_sql [USING] [Bind Var]; END; / ORACLE to ALTIBASE 변환가이드 32 page of 37

2. ALTIBASE CREATE OR REPLACE TYPESET my_type AS TYPE my_cur IS REF CURSOR; END; / CREATE OR REPLACE PROCEDURE opencursor ( v_result OUT my_type.my_cur, v_sql IN VARCHAR(200) ) AS BEGIN OPEN y_result FOR v_sql [USING] [Bind Var]; END; / WHERE CURRENT OF 구문 ALTIBASE 는 CURSOR 를이용한 WHERE CURRENT OF 구문을지원하지않는다. 다만, 해당 TABLE 에 PRIMARY KEY 가있다면다음과같이변경이가능하다. 1. ORACLE CREATE OR REPLACE PROCEDURE proc1 IS CURSOR emp_list IS SELECT empno FROM employee WHERE empno = 1 FOR UPDATE; BEGIN FOR emplst IN emp_list LOOP UPDATE employee SET empjob = 'SALESMAN' WHERE CURRENT OF emp_list; END LOOP; END; / 2. ALTIBASE CREATE OR REPLACE PROCEDURE proc1 AS BEGIN DECLARE CURSOR cur1 IS SELECT empno FROM employee WHERE empno = 1; v_empjob VARCHAR(10); v_empno INTEGER; BEGIN ORACLE to ALTIBASE 변환가이드 33 page of 37

OPEN cur1; LOOP FETCH cur1 INTO v_empno, v_empjob; EXIT WHEN cur1%notfound; UPDATE employee SET empjob = 'SALESMAN' WHERE emp_no = v_empno; //emp_no 가 PK 이어야한다. END LOOP; CLOSE cur1; END; END; / EXCEPTION ORACLE 과 ALTIBASE 는 Stored PROCEDURE/FUNCTION 에서발생하는 EXCEPTION 들을미리시스템에서정의해놓았다. 다음은시스템정의 EXCEPTION 에대해비교한표이다. ORACLE ALTIBASE SQLERRM SQLCODE SQLERRM SQLCODE CURSOR_ALREADY_OPEN -6530 CURSOR_ALREADY_OPEN 201062 DUP_VAL_ON_INDEX -1 DUP_VAL_ON_INDEX 201063 INVALID_CURSOR -1001 INVALID_CURSOR 201064 INVALID_NUMBER -1722 INVALID_NUMBER 201065 NO_DATA_FOUND +100 NO_DATA_FOUND 100 PROGRAM_ERROR -6501 PROGRAM_ERROR 201067 STROAGE_ERROR -6500 STROAGE_ERROR 201068 TIMEOUT_ON_RESOURCE -51 TIMEOUT_ON_RESOURCE 201069 TOO_MANY_ROWS -1422 TOO_MANY_ROWS 201070 VALUE_ERROR -6502 VALUE_ERROR 201071 ZERO_DIVIDE -1476 ZERO_DIVIDE 201072 ACCESS_INTO_NULL -6530 CASE_NOT_FOUND -6592 COLLECTION_IS_NULL -6531 LOGIN_DENIED -1017 NOT_LOGGED_ON -1012 ROWTYPE_MISMATCH -6504 지원하지않음 SELF_IS_NULL -30625 SUBSCRIPT_BEYOND_COUN T -6533 SUBSCRIPT_OUTSIDE_LIMIT -6532 ORACLE to ALTIBASE 변환가이드 34 page of 37

SYS_INVALID_ROWID -1410 ORACLE to ALTIBASE 변환가이드 35 page of 37

DATA MIGRATION ORACLE 데이터를 ALTIBASE 로이관하는방법에대해기술한다. DATA MIGRATION 방법 ORACLE DATA 를 ALTIBASE 로이관하기위해서는 ORACLE 관련유틸리티 (ex. SQLDeveloper) 를이용하여데이터를텍스트파일로 download 하고이텍스트파일을 ALTIBASE 의 iloader 유틸리티를이용하여 ALTIBASE 로 upload 한다. ALTIBASE 의 iloader 사용법은 iloader 매뉴얼을참고하면된다. ORACLE to ALTIBASE 변환가이드 36 page of 37

알티베이스 서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 1008 호 02-2082-1000 http://www.altibase.com 대전사무소대전광역시서구둔산동 921 주은리더스텔 901 호 042-489-0330 기술지원본부서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 908 호 02-2082-1000 솔루션센터 02-2082-1114 http://support.altibase.com Copyright c 2000~2013 ALTIBASE Corporation. All Rights Reserved. 이문서는정보제공을목적으로제공되며, 사전에예고없이변경될수있습니다. 이문서는오류가있을수있으며, 상업적또는특정목적에부합하는명시적, 묵시적인책임이일체없습니다. 이문서에포함된 ALTIBASE 제품의특징이나기능의개발, 발표등의시기는 ALTIBASE 재량입니다. ALTIBASE는이문서에대하여관련된특허권, 상표권, 저작권또는기타지적재산권을보유할수있습니다. ORACLE to ALTIBASE 변환가이드 37 page of 37