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

Microsoft Word - 04_EXCEPTION.doc

ALTIBASE HDB Patch Notes

ALTIBASE 사용자가이드 Templete

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

PowerPoint Presentation

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

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

Jerry Held


강의 개요

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

SQL Tuning Business Development DB

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

FlashBackt.ppt

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

untitled

객관식 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;

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

ePapyrus PDF Document

歯PLSQL10.PDF

Oracle Database 10g: Self-Managing Database DB TSC

PowerPoint Presentation

DBMS & SQL Server Installation Database Laboratory

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

Microsoft PowerPoint - Oracle Data Access Pattern.ppt

슬라이드 1

1217 WebTrafMon II

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

untitled

MySQL-.. 1

90

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

<4D F736F F D203033C6C4C6BCBCC72DB8AEBFC0B1D7B9E6B9FD2E646F63>

TITLE

문서 템플릿

ESQL/C

Simplify your Job Automatic Storage Management DB TSC

Remote UI Guide

10.ppt

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

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

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

ALTIBASE 사용자가이드 Templete

ALTIBASE HDB Patch Notes

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

PowerPoint Presentation

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

Microsoft Word - 05_SUBPROGRAM.doc

USER GUIDE

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

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

Microsoft PowerPoint - ch07 - 포인터 pm0415

DocsPin_Korean.pages

chap 5: Trees

ALTIBASE HDB Patch Notes

PRO1_02E [읽기 전용]

Orcad Capture 9.x

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

PowerPoint 프레젠테이션

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

제목을 입력하세요.

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

62

결과보고서

슬라이드 제목 없음

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

휠세미나3 ver0.4

Microsoft PowerPoint - 10Àå.ppt

ETL_project_best_practice1.ppt

슬라이드 1

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

The Self-Managing Database : Automatic Health Monitoring and Alerting

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

PowerPoint 프레젠테이션

Microsoft Word - PLSQL.doc

6장. SQL

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

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

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

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

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

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

Lab 3. 실습문제 (Single linked list)_해답.hwp

Microsoft PowerPoint - PLSQL.ppt

PowerPoint Presentation

Microsoft PowerPoint - PLSQL.ppt

Interstage5 SOAP서비스 설정 가이드

목차 1. 제품 소개 특징 개요 Function table 기능 소개 Copy Compare Copy & Compare Erase

Microsoft PowerPoint - [2009] 02.pptx

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

RVC Robot Vaccum Cleaner

Transcription:

Real Alternative DBMS ALTIBASE, Since 1999 ORACLE to ALTIBASE 변환가이드 ALTIBASE 5.3.3 2010. 03 Copyright c 2000~2010 ALTIBASE Corporation. All Rights Reserved.

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

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

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

OBJECT 변환 ORACLE 의 OBJECT 를 ALTIBASE 로변환할때고려할사항에대해기술한다. DATATYPE ORACLE 의 TABLE 을 ALTIBASE 로변환할때각각의 DATATYPE 을어떻게변환하는지에대해설명한다. 분류 ORACLE ALTIBASE 비고 CHAR CHAR 최대 32K VARCHAR2, VARCHAR VARCHAR2, VARCHAR 최대 32K. DESC 로조회시 VARCHAR 로조회 문자타입 NCHAR NCHAR 문자길이최대 16000(UTF16), 문자길이최대 10666(UTF8) NVARCHAR2 NVARCHAR 문자길이최대 16000(UTF16), 문자길이최대 10666(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 를줄일수있고, 저장공간의효율성이좋아지기때문이다. FLOAT 지정시 precision 을지정하지않을경우 23byte 로지정되므로, 적절한값을지정해주는것이좋다. SMALLINT SMALLINT 2 byte 정수형타입 INT INTEGER 4 byte 정수형타입 REAL REAL 4 byte 실수형타입 BINARY_DOUBLE DOUBLE 8 byte 실수형타입 날짜타입 DATE DATE ALTIBASE DATE 타입은 ORACLE DATE 타입의표현범위를포함 ORACLE to ALTIBASE 변환가이드 5 page of 33

분류 ORACLE ALTIBASE 비고 INTERVAL YEAR TO MONTH 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 DATABASE TRIGGER DIMENSTION EXTERNAL PROCEDURE LIBRARY INDEX-ORGANIZED TABLE INDEX INDEXTYPE 지원하지않음 CHECK 는지원하지않음. 그외모두지원 SELECT 만가능 지원. BEFORE UPDATE, DDL TRIGGER 는지원하지않음 지원하지않음 지원하지않음 지원하지않음 BTREE, RTREE 만지원. BITMAP, CLUSTER, Function based, Global partitioned INDEX 는지원하지않음 지원하지않음 ORACLE to ALTIBASE 변환가이드 6 page of 33

JAVA 관련객체 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 ORACLE to ALTIBASE 변환가이드 7 page of 33

TABLESPACE 로생성되므로 ORACLE 과동일한 CREATE TABLESPACE 구문으로변환이가능하다. 다음은 ORACLE 의 TABLESPACE 를 ALTIBASE 로변환할때 CREATE TABLESPACE 구문에서지정하는여러옵션들의변환가이드를설명한것이다. ORACLE ALTIBASE 비고 BIGFILE SMALLFILE - ALTIBASE는지원하지않으므로 변환시해당옵션삭제 DATAFILE file specification DATAFILE file specification MINIMUM EXTENT - LOGGING NOLOGGING - FORCE LOGGING - DEFAULT storage 구문 - ONLINE OFFLINE - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 EXTENT MANAGEMENT LOCAL DICTIONARY SEGMENT SPACE MANAGEMENT AUTO MANUAL SEGMENT MANAGEMENT AUTO MANUAL - FLASHBACK ON OFF - ALTIBASE는지원하지않으므로 변환시해당옵션삭제 2. TEMPORARY TABLESPACE ALTIBASE 는 ORACLE 과마찬가지로 CREATE TEMPORATY TABLESPACE ~ TEMPFILE 구문으로 TEMPORARY TABLESPACE 를생성한다. 다만생성시다음의옵션은알맞게변환해야한다. ORACLE ALTIBASE 비고 TABLESPACE GROUP - EXTENT MANAGEMENT LOCAL DICTIONARY - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 3. UNDO TABLESPACE ALTIBASE 는 UNDO TABLESPACE 를사용자가생성할수없다. ALTIBASE 가기본적으로제공하는 SYS_TBS_DISK_UNDO TABLESPACE 만사용할수있다. ORACLE to ALTIBASE 변환가이드 8 page of 33

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 의 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 - ALTIBASE는지원하지않으므로 CLUSTER - 변환시해당옵션삭제 ORACLE to ALTIBASE 변환가이드 9 page of 33

COMPRESS NOCOMPRESS 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 절, 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 - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 ORACLE to ALTIBASE 변환가이드 10 page of 33

OPTIMAL - BUFFER POOL - 4. LOB STORAGE 절 ORACLE ALTIBASE 비고 TABLESPACE TABLESPACE ALTIBASE의 LOB STORAGE절은 TABLESPACE만지정가능 STORAGE - CHUNK - PCTVERSION - RETENTION - FREEPOOLS - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 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 는지원하지않으므로변환시해당옵션삭제 ORACLE to ALTIBASE 변환가이드 11 page of 33

CREATE INDEX ALTIBASE 는 BTREE 와 RTREE INDEX 만제공하고 BITMAP, CLUSTER, Function based, 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 - ONLINE - COMPRESS NOCOMPRESS - ALTIBASE 는지원하지않으므로변환시해당옵션삭제 PCTFREE, PCTUSED, - INITRANS Storage 구문 INITRANS TABLE 의 Storage 구문과동일 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 ORACLE to ALTIBASE 변환가이드 12 page of 33

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 TRIGGER 시사용하는구문을 ALTIBASE 로변환할때고려해야할사항에대해설명한것이다. ORACLE ALTIBASE 비고 BEFORE AFTER INSTEAD OF BEFORE AFTER ALTIBASE 는 BEFORE UPDATE 와 INSTEAD OF 는지원하지않음 DML 이벤트구문 DML 이벤트구문 ALTIBASE는 OR를이용해여러 DML 이벤트를지정할수없다. DML 이벤트 구문은 ORACLE과동일 DDL 이벤트구문 - ALTIBASE는 DDL TRIGGER를제공하지 않음 WHEN 조건 FOR EACH ROW WHEN 조건 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) ORACLE to ALTIBASE 변환가이드 13 page of 33

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 지정, ); 문으로여러개의 Constraint 를추가하는문장은 Constraint 별로나눠서 ALTER TABLE ADD CONSTRAINT constraint_name constraint 지정 ; 문으로 Constraint 별로나눠서실행해야하고비록 Constraint 를 1 개만지정한다하더라도 ( 와 ) 로묶을수없다. ORACLE 은 PRIMARY KEY 와 UNIQUE 를지정시 INDEX 를미리생성한후지정이가능하지만, ALTIBASE 는 Constraint 를지정하는시점에내부적으로 INDEX 를생성하기때문에동일컬럼에대해 PK Constraint, UNIQUE Constraint, INDEX 생성중하나만가능하다. 즉, INDEX 를생성한컬럼에 PK Constraint 를지정할수없다 ORACLE to ALTIBASE 변환가이드 14 page of 33

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 로변경된질의 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 ORACLE to ALTIBASE 변환가이드 15 page of 33

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 과일반 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, test2 t2 LEFT OUTER JOIN test3 t3 ON t2.c = t3.c WHERE t1.a = t2.a AND t1.a = 2; 기준 TABLE(test3) 를 LEFT OUTER JOIN 구문왼쪽에위치시키고, OUTER JOIN 대상 TABLE(test1) 을 LEFT OUTER JOIN 오른쪽에위치시킨후여러개의 JOIN 조건을 ON 절에 AND 연산자를이용하여명시한다. 일반 JOIN 연산은 WHERE 절에서 = 연산자를이용하여명시하고, 만약기타다른 ORACLE to ALTIBASE 변환가이드 16 page of 33

조건이있다면 WHERE 절에 AND 연산자를이용하여해당조건을추가해주면된다. 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 로변경 2. ROW_NUMBER() PARTITION BY ORACLE to ALTIBASE 변환가이드 17 page of 33

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 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 ORACLE to ALTIBASE 변환가이드 18 page of 33

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에서사용하는 START WITH와 CONNECT BY 절은 ALTIBASE에서도동일하게지원하므로변환없이사용할수있다. ORACLE to ALTIBASE 변환가이드 19 page of 33

하지만다음의사항을주의해야한다. 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 ------------------------------------------------------------------------------------------------ 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 ORACLE to ALTIBASE 변환가이드 20 page of 33

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. 1. CONNECT_BY_ROOT 자신의최상의 ROOT 노드즉, LEVEL 1 에해당하는값을나타내는의사컬럼이다. 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; 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 로만들어 PRODUCT 연산을수행한다. 2. CONNECT_BY_ISLEAF CONNECT_BY_ISLEAF 는자신의 LEAF 노드일경우 ( 자식을갖지않을경우 ) 에 1 을 return 하고그렇지않을경우에 0 을 return 하는의사컬럼이다. 2.1 ORACLE 질의 SELECT LPAD(' ',2*(LEVEL-1)) item_name AS item_names, CONNECT_BY_ISLEAF FROM pc START WITH parent_id IS NULL CONNECT BY PRIOR item_id = parent_id; 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 ORACLE to ALTIBASE 변환가이드 21 page of 33

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 을리턴한다. 3. SYS_CONNECT_BY_PATH ROOT 노드부터해당레코드항목까지의경로 (PATH) 를반환한다. 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; 3.2 ALTIBASE 로변경된질의 3.2.1 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; END ; END; / 3.2.2 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; ORACLE to ALTIBASE 변환가이드 22 page of 33

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 A test2 10 C test5 5 1. ROLLUP 1.1 ORACLE 질의 SELECT group_id, sales_emp, SUM(sales_qty) FROM tmp_sales ORACLE to ALTIBASE 변환가이드 23 page of 33

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 대신공백 으로나타난다. GRANT 구문 ORACLE 은특정 USER 의 OBJECT 권한을관리자가부여할수있지만, ALTIBASE 는 OBJECT 를소유한 USER 만이부여할수있다. ORACLE to ALTIBASE 변환가이드 24 page of 33

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 모드와동일한결과가나타난다. 참고로, ORACLE 은 AUTOCOMMIT 모드로지정해도 PROCEDURE/FUNCTION 내부에서는 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 변환가이드 25 page of 33

/ 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; ORACLE to ALTIBASE 변환가이드 26 page of 33

PRINTLN(col1); END LOOP; 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 변환가이드 27 page of 33

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 과 ALTIABSE 에서 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 변환가이드 28 page of 33

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 변환가이드 29 page of 33

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 변환가이드 30 page of 33

SYS_INVALID_ROWID -1410 ORACLE to ALTIBASE 변환가이드 31 page of 33

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

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