본문 바로가기
개발/database

[oracle] 오라클 [Oracle To Sybase Migration Guide] 간단한 개발자 가이드

by 가시죠 2021. 1. 17.
반응형

프로젝트를 진행하다보면 Oracle 에서 Sybase로 변경하는 경우가 간혹 발생하여 정리 한다.

 

 

Oracle과 Sybase 제품군 비교

Oracle Sybase
Oracle Database Server Sybase ASE
Oracle OLAP and DW Sybase IQ
Oracle Analytics Sybase IQ
Oracle RAC Sybase ASE Cluster Edition
Oracle Times Ten Sybase ASE 15.5 In-Memory Database
Oracle Data Guard Sybase Mirror Activator
Oracle Streams Sybase Replication Server
Oracle ExalData Sybase IQ Appliance
MySQL Sybase ASE 15 Express, Free to use on Linux

 

DATA Types 비교

Oracle Description Sybase ASE Comments
NUMBER(x) 소수점이 없는 숫자형식 BIGINT NUMBER의 길이
데이터 형식이 15보다 큽니다.
FLOAT NUMBER의 길이
데이터 유형은 11과 15사이에 있다.
INTEGER 길이가 6에서 10사이라면 사용
SMALLINT 길이가 4에서 5사이라면 사용
TINYINT 길이가 2에서 3사이
255와 같거나 작음 (데이터 <=255) 
BIT 길이가 1
NUMBER(x,y) 소수점이 존재하는 숫자형식 DOUBLE 소수점포함 전체 자릿수가 15 보다 클때
(데이터 > 15)
FLOAT 소수점포함 전체 자릿수가 15 이하일때
(데이터 <= 15)
NUMBER(x,y) 소수점이 존재하는 숫자형식 NUMERIC(x,y) 오라클과 동일
DECIMAL(x,y) 오라클과 동일
NUMERIC보다 정밀도가 높으나 결론은 동일함
MONEY NUMBER(x,2) 로 고정
FLOAT 오라클 MAX 38자리 DOUBLE (데이터 > 15)
FLOAT (데이터 <= 15)
CHAR(x) 오라클 MAX 2,000 bytes CHAR(x) 1953 byte 보다 작을 경우 사용
TEXT 1953 byte 보다 큰 경우 사용 무제한
VARCHAR2(x) 오라클 MAX 4,000 bytes VARCHAR(x) 4001 byte 보다 작을 경우 사용
TEXT 무제한
DATE   DATETIME  
TIMESTAMP 오라클 수용범위
1/100000000th of a second.
BIGDATETIME 오라클의 TIMESTAMP 수용범위를 만족함
RAW(x) 오라클 MAX 2,000 bytes BINARY(x) 1953 byte보다 작은경우 사용
IMAGE 1953 byte보다 큰 경우 사용, 무제한
ROWID 오라클은 10자리 문자열 타입임 CHAR(10) 10자리
CLOB 오라클 MAX 128TB TEXT MAX 4GB
BLOB 128TB IMAGE MAX 4GB
CHAR(1) 1자리 문자열 BIT 1자리 문자열

 

System Function 비교

Oracle Description Sybase ASE Comments
CEIL   CEILING  
TRUNC   CONVERT(INT,…)  
SUBSTR()   SUBSTRING()  
LENGTH()   CHAR_LENGTH()  
CHR()   CHAR()  
TO_CHAR   CONVERT  
TO_NUMBER   CONVERT(NUMERIC(n,n),field)  

 

Data Function 비교

Oracle Description Sybase ASE Comments
LAST_DAY   N/A  
SYSDATE   GETDATE()  
NVL   ISNULL  
NVL2
E.g NVL2(salary,salary*2,0)
  CASE 문 활용
E.g. CASE
WHEN salary = NULL THEN 0
ELSE salary * 2
END
 
DECODE   CASE 문 활용  
add_months E.g
SELECT add_months( col, 3) FROM DUAL
DATEADD E.g
SELECT DATEADD(month, 3, col)

 

SELECT 구문 예시

Oracle Sybase
SELECT
  DECODE(T1.C1, 'CLNN', T2.C2, T3.C3) as P_ID,
  T4.ID as ID
FROM T4, T1, T2, T3
WHERE T4.ID = T1.ID(+)
and T1.ID(+) = 'L3'
and T4.ID = T2.ID(+)
and T4.ID = T3.ID(+)
and T3.TYPE='C'
and T3.STAT = '00'
SELECT
  case T1.C1 when 'CLNN' then T2.C2 else T3.C3 end as P_ID,
  T4.ID as ID
  into tempdb..query13
FROM T1
  left outer join T2 on T1.ID = T2.ID and T1.ID = 'L3'
  left outer join T3 on T1.ID = T3.ID
  left outer join T4 on T1.ID = T4.ID
where T3.TYPE='C'
and T3.STAT = '00'
SELECT
  T1.EFF_DATE, NVL(T1.END_DATE, 0) as END_DATE,
  T1.ID
FROM T1
WHERE T1.STAT='00'
AND (T1.ID, T1.TIMESTAMP)
  IN (SELECT
        T1.ID,
        MAX(T1.TIMESTAMP) as TIMESTAMP
      FROM T1
      WHERE T1.STAT='00'
      GROUP BY T1.ID)
select 
  T1.EFF_DATE, isnull(T1.END_DATE,0) as END_DATE,
  T1.ID
from (select EFF_DATE, END_DATE, ID, TIMESTAMP
        from T1
        where STAT='00') as T1,
       (select ID, max(TIMESTAMP) as TIMESTAMP
        from T1
        where STAT='00'
        group by ID) as T2
where T1.ID = T2.ID
and T1.TIMESTAMP = T2.TIMESTAMP
INSERT INTO <table> (col1, col2) SELECT FROM …. 가능함, 오라클과 동일

 

INSERT 구문 예시

Oracle Sybase
INSERT INTO state (state_abbrev) VALUES ('WA');
COMMIT;
SELECT * FROM state;
INSERT INTO state (state_abbrev) VALUES ('WA')
GO
SELECT * FROM state
GO

 

기타 설명

Oracle 설명 Sybase 설명
쿼리 구분자 ; 쿼리 구분자 GO
대소문자 구분 (Sybase는 대소문자를 구분한다.)
테이블명 : test
select * from TEST
 => 가능
대소문자 구분 (Sybase는 대소문자를 구분한다.)
테이블명 : test
select * from TEST
 => 오류 (존재하지 않는 테이블)
문자열 조합 ||
E.g (name1 || ' ' || name2) as fullname
문자열 조합 +
E.g (name1 + ' ' + name2) as fullname
숫자형태 (id 컬럼은 숫자컬럼)
SELECT id = '100'
동작하지만 권장하지 않음
숫자형태 (id 컬럼은 숫자컬럼)
SELECT id = 100
쿼리툴에서….
트랜잭션 처리 후 필요시 ROLLBACK or COMMIT
쿼리툴에서….

Sybase는 AUTO COMMIT 임.

필요시 아래와 같이 BEGIN TRAN 선언 후 작업 함
    BEGIN TRAN
    DELETE FROM <table> WHERE ID = '1'

데이터 확인 후 COMMIT or ROLLBACK
DISTINCT DISTINCT 사용가능
flashback-query flashback-query 지원 안함
SELECT sysdate FROM dual SELECT getdate()
CREATE TABLE <newtable> as select * from <oldtable> SELECT col1, col2 INTO <newtable> FROM <oldtable>
SELECT * FROM ALL_TABLES sp_help
SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'name' sp_help <object_name>
SELECT NVL(a.username, '(oracle)') AS
username,
 a.osuser,
 a.sid,
 a.serial#,
d.spid AS process_id,
 a.wait_class,
 a.seconds_in_wait,
 a.state,
 a.blocking_session,
 a.blocking_session_status,
 a.module,
 TO_CHAR(a.logon_Time,'DD-MON-YYYY
HH24:MI:SS') AS logon_time
FROM v$session a,
 v$process d
WHERE a.paddr = d.addr
AND a.status = 'ACTIVE'
ORDER BY 1,2;
sp_who
SELECT LPAD(' ', (level-1)*2, ' ') ||
NVL(s.username, '(oracle)') AS username,
 s.osuser,
 s.sid,
 s.serial#,
 s.lockwait,
 s.status,
 s.module,
 s.machine,
 s.program,
 TO_CHAR(s.logon_Time,'DD-MON-YYYY
HH24:MI:SS') AS logon_time
FROM v$session s
CONNECT BY PRIOR s.sid =
s.blocking_session
START WITH s.blocking_session IS NULL; A50
sp_lock
SELECT * FROM v$database; sp_helpdb
SELECT * FROM v$instance; sp_server_info
SELECT * FROM v$version; select @@version
SELECT a.name,  a.value FROM v$sga a; sp_configure ‘mem’
[Query Plan 조회]

SELECT LPAD(' ', 2 * (level - 1)) ||
 DECODE (level,1,NULL,level-1 || '.'
|| pt.position || ' ') ||
 INITCAP(pt.operation) ||
 DECODE(pt.options,NULL,'',' (' ||
INITCAP(pt.options) || ')') plan,
 pt.object_name,
 pt.object_type,
 pt.bytes,
 pt.cost,
 pt.partition_start,
 pt.partition_stop
FROM plan_table pt
START WITH pt.id = 0
 AND pt.statement_id = '<session ID>'
CONNECT BY PRIOR pt.id = pt.parent_id
 AND pt.statement_id = '<session ID>';
sp_showplan <spid>
[상위 10개 리소스 점유]

SELECT *
FROM (SELECT Substr(a.sql_text,1,50)
sql_text,

Trunc(a.disk_reads/Decode(a.executions,0,1
,a.executions)) reads_per_execution,
 a.buffer_gets,
 a.disk_reads,
 a.executions,
 a.sorts,
 a.address
 FROM v$sqlarea a
 ORDER BY 2 DE
select top 10 * from
master..monProcessObject order by
PhysicalReads desc

 

반응형

댓글