개요
본 문서는 Microsoft사의 SQL Server에서 ALTIBASE로 변환할 때 고려할 사항과 변환 방법에 대해 설명한다.
SQL Server 2012와 Altibase 6.1 버전을 대상으로 한다.
Object 변환
MS SQL SERVER의 OBJECT를 ALTIBASE로 변환할 때 고려할 사항에 대해 기술한다.
DATATYPE
SQL SERVER의 TABLE을 Altibase로 변환할 때 각각의 DATATYPE을 어떻게 변환하는지에 대해 설명한다.
분류 | SQL Server | Altibase | 비고 |
---|---|---|---|
문자타입
| CHAR | CHAR |
|
VARCHAR | VARCHAR | varchar(max)는 CLOB으로 변환 | |
TEXT | CLOB사용 |
| |
NCHAR | NCHAR | Max length: 16000(UTF16), | |
NVARCHAR | NVARCHAR | Max length: 16000(UTF16), | |
NTEXT | NVARCHAR 사용 | Max length: 16000(UTF16), Max length: 10666(UTF8) | |
BINARY | BYTE사용 |
| |
VARBINARY | BLOB사용 |
| |
IMAGE | BLOB사용 |
| |
숫자타입
| BIGINT | BIGINT |
|
NUMERIC | NUMERIC |
| |
BIT | BIT |
| |
SMALLINT | SMALLINT |
| |
REAL | REAL |
| |
날짜타입
| DATE | DATE |
|
DATETIMEOFFSET | DATE 사용 |
| |
DATETIME2 | DATE 사용 | Altibase의 Scale은 마이크로초(6자리)까지 지원. | |
SAMMLLDATETIME | DATE 사용 |
| |
DATETIME | DATE 사용 |
| |
TIME | DATE 사용 |
|
FUNCTION & EXPRESSION
분류 | SQL Server | Altibase | 비고 |
Aggregate
| AVG | AVG |
|
CHECKSUM_AGG | N/A |
| |
COUNT | COUNT |
| |
COUNT_BIG | COUNT |
| |
GROUPING | N/A |
| |
GROUPING_ID | N/A |
| |
MAX | MAX |
| |
MIN | MIN |
| |
STDEV | STDDEV 사용 |
| |
STDEVP | N/A |
| |
SUM | SUM |
| |
VAR | VARIANCE |
| |
Ranking
| DENSE_RANK | DENSE_RANK |
|
NTILE | N/A |
| |
RANK | RANK |
| |
ROW_NUMBER | ROW_NUMBER |
| |
Conversion
| CAST, CONVERT | CAST 사용 | Altibase의 CONVERT 함수는 다른 기능 제공 |
PARSE | CAST 사용 | CONVERT 함수를 이용하여 캐릭터셋 변경 가능 | |
TRY_CAST | CAST 사용 | 캐스팅 실패시 오류 반환 | |
TRY_CONVERT | N/A |
| |
TRY_PARSE | N/A |
| |
Date
| CURRENT_TIMESTAMP | SYSDATE 사용 |
|
DATENAME | DATENAME |
| |
DATEPART | DATEPART |
| |
DAY | DATEPART 사용 |
| |
DATEADD | DATEADD | 구문 변경 DATEADD (date, number, date_field_name) | |
DATEDIFF | DATEDIFF | 구문 변경 | |
DATEFROMPARTS | TO_DATE 사용 |
| |
DATETIME2FROMPARTS | TO_DATE 사용 |
| |
DATETIMEFROMPARTS | TO_DATE 사용 |
| |
DATETIMEOFFSETFROMPARTS | TO_DATE 사용 |
| |
EOMONTH | LAST_DAY 사용 |
| |
GETDATE | SYSDATE 사용 |
| |
GETUTCDATE | N/A |
| |
ISDATE | N/A |
| |
SMALLDATETIMEFROMPARTS | TO_DATE 사용 |
| |
SWITCHOFFSET | N/A |
| |
SYSDATETIME | SYSDATE 사용 |
| |
SYSDATETIMEOFFSET | N/A |
| |
SYSUTCDATETIME | N/A |
| |
TIMEFROMPARTS | TO_DATE 사용 |
| |
TODATETIMEOFFSET | N/A |
| |
YEAR | TO_CHAR 사용 |
| |
Logical
| CHOOSE | N/A |
|
IIF | NVL2 사용 |
| |
Mathematical
| ABS | ABS |
|
ACOS | ACOS |
| |
ASIN | ASIN |
| |
ATAN | ATAN |
| |
ATN2 | ATN2 |
| |
CEILING | CEIL 사용 |
| |
COS | COS |
| |
COT | N/A |
| |
DEGREES | N/A |
| |
EXP | EXP |
| |
FLOOR | FLOOR |
| |
LOG | LN 사용 | Altibase의 LOG 함수는 다른 기능제공 | |
LOG10 | N/A |
| |
PI | LOG10 |
| |
POWER | POWER |
| |
RADIANS | N/A |
| |
RAND | RANDOM 사용 | Altibase는 Integer형식으로 반환 | |
ROUND | ROUND |
| |
SIGN | SIGN |
| |
SIN | SIN |
| |
SQRT | SQRT |
| |
SQUARE | N/A |
| |
TAN | TAN |
| |
String
| ASCII | ASCII |
|
CHAR | CHAR |
| |
CHARINDEX | INSTR, POSITION 사용 |
| |
CONCAT | CONCAT |
| |
DIFFERENCE | N/A |
| |
FORMAT | N/A |
| |
LEFT | SUBSTR, SUBSTRING 사용 | SUBSTR (expr, start [DOCKI:, length]) | |
LEN | LENGTH 사용 |
| |
LOWER | LOWER |
| |
LTRIM | LTRIM | Altibase는 LTRIM (expr1 [DOCKI:,expr2]) | |
NCHAR | NCHAR |
| |
PATINDEX | INSTR, POSITION 사용 |
| |
QUOTENAME | N/A |
| |
REPLACE | REPLACE2 사용 |
| |
REPLICATE | REPLICATE |
| |
REVERSE | REVERSE_STR 사용 |
| |
RIGHT | SUBSTR, SUBSTRING 사용 | SUBSTR (expr, start [DOCKI:, length]) | |
RTRIM | RTRIM | Altibase는 RTRIM (expr1 [DOCKI:,expr2]) | |
PATINDEX | INSTR, POSITION 사용 |
| |
QUOTENAME |
|
| |
REPLACE | REPLACE2 사용 |
| |
REPLICATE | REPLICATE |
| |
REVERSE | REVERSE_STR 사용 |
| |
RIGHT | SUBSTR, SUBSTRING 사용 | SUBSTR (expr, start [DOCKI:, length]) | |
RTRIM | RTRIM | Altibase는 RTRIM (expr1 [DOCKI:,expr2]) | |
SOUNDEX | N/A |
| |
SPACE | LPAD, RPAD 사용 |
| |
STR | TO_CHAR 사용 |
| |
STUFF | STUFF |
| |
SUBSTRING | SUBSTRING |
| |
UNICODE | N/A |
| |
UPPER | UPPER |
|
OBJECT
분류 | SQL Server | Altibase | 비고 |
---|---|---|---|
CONSTRAINT | 지원 | 지원 |
|
TRIGGER | 지원 | 지원 |
|
Multi Key-Index | 지원 | 지원 |
|
VIEW | 지원 | 지원 |
|
UPDATABLE VIEW | 지원 | 지원하지 않음 |
|
SEQUENCE | 지원 | 지원 |
|
STORED FUNCTION/PROCEDURE | 지원 | 지원 |
|
SYNONYM | 지원 | 지원 |
|
TABLE Temporary Table | 지원 | 지원 | Temporary Table은 Volatile Table Space 이용 |
USER | 지원 | 지원 |
|
REPLICATION | 지원 | 지원 |
|
CREATE TABLESPACE
SQL Server에서는 데이터 저장소로 Database를 관리하나 Altibase에서는 테이블스페이스를 관리한다. Altibase에서의 테이블스페이스는 저장 공간에 따라 메모리 테이블스페이스, 디스크 테이블스페이스로 나뉘며 생성 주체에 따라 시스템 테이블스페이스, 사용자 정의 테이블 스페이스, 저장 내용에 따라 딕셔너리 테이블스페이스, 언두 테이블스페이스, 임시 테이블스페이스, 데이터 테이블 스페이스 등으로 나뉘어 진다.
따라서 Altibase로 변환할 때는 데이터 저장 공간에 따라 CREATE MEMORY DATA TABLESPACE, CREATE DISK DATA TABLESPACE 구문을 이용하여 생성한다.
다음은 SQL Server의 DATABASE를 Altibase의 테이블스페이스로 변환할 때 CREATE TABLESPACE 구문에서 지정하는 여러 옵션들의 변환 가이드를 설명한 것이다.
SQL Server | Altibase | 비고 |
---|---|---|
FILENAME | FILENAME |
|
SIZE | SIZE | 기본 100MB |
MAXSIZE | MAXSIZE |
|
FILEGROWTH | AUTOEXTEND ON NEXT |
|
FILESTREAM | N/A |
|
DEFAULT_FULLTEXT_LANGUAGE | N/A |
|
DEFAULT_LANGUAGE | N/A |
|
NESTED_TRIGGERS | N/A |
|
TRANSFORM_NOISE_WORDS | N/A |
|
TWO_DIGIT_YEAR_CUTOFF | N/A |
|
DB_CHAINING | N/A |
|
TRUSTWORTHY | N/A |
|
CREATE TABLE
SQL Server의 TABLE을 Altibase로 변환할 때 CREATE TABLE 시 사용한 여러 옵션을 알맞게 변경해야 한다. Altibase는 TEMPORARY TABLE, OBJECT TABLE, XMLType TABLE을 제공하지 않는다.
Altibase는 메모리 TABLE을 제공한다. 따라서 변환할 TABLE의 특성을 잘 파악하여 메모리 TABLE을 생성한다면 메모리 TABLESPACE를 지정하여 생성해야 한다. 만약 메모리 TABLE을 생성한다면 SQL Server에서 사용했던 CREATE TABLE 구문에 사용한 옵션들을 사용할 수 없다. 메모리 TABLE 생성 구문은 Altibase의 SQL 관련 매뉴얼을 참조하면 된다.
ORACLE의 TABLE을 DISK TABLE로 변환하고자 한다면, CREATE TABLE 시 설정할 수 있는 여러 옵션을 다음과 같이 Altibase에 맞게 변환해야 한다.
1. Column definition
SQL Server | Altibase | 비고 |
---|---|---|
FILESTREAM | N/A |
|
COLLATE | N/A |
|
CONSTRAINT | CONSTRAINT | Altibase는 CHECK를 제외한 Constraint를 지원한다. 또한 Constraint 지정시 references 절의 ON DELETE SET NULL(ON DELETE CASCADE는 지원) 옵션을 제공하지 않으므로 삭제. |
IDENTITY | N/A |
|
ROWGUIDCOL | N/A |
|
2. data type
SQL Server | Altibase | 비고 |
---|---|---|
Precision, scale | Precision, scale |
|
max | N/A |
|
CONTENT | N/A |
|
DOCUMENT | N/A |
|
xml_schema_collection | N/A |
|
3. column constraint
SQL Server | Altibase | 비고 |
---|---|---|
PRIMARY KEY | PRIMARY KEY |
|
NULL, NOT NULL | NULL, NOT NULL |
|
UNIQUE | UNIQUE |
|
CLUSTERED, NONCLUSTERED | N/A |
|
FOREIGN KEY REFERENCES | FOREIGN KEY REFERENCES |
|
partition_scheme_name | PARTITION BY RANGE | HASH | LIST | Table 생성시 파티션테이블 종류 지정. |
4. computed column definition
지원하지 않음
5. table constraint
SQL Server | Altibase | 비고 |
---|---|---|
PRIMARY KEY | PRIMARY KEY |
|
CLUSTERED, NONCLUSTERED | N/A |
|
FOREIGN KEY REFERENCES | FOREIGN KEY REFERENCES |
|
partition_scheme_name | PARTITION BY RANGE | HASH | LIST | Table 생성시 파티션테이블 종류 지정. |
6. table_option
SQL Server | Altibase | 비고 |
---|---|---|
DATA_COMPRESSION | N/A |
|
7. index_option
SQL Server | Altibase | 비고 |
---|---|---|
PAD_INDEX | N/A |
|
FILLFACTOR | N/A |
|
IGNORE_DUP_KEY | N/A | Altibase는 ON 상태임 |
STATISTICS_NORECOMPUTE | N/A | Altibase는 OFF 상태임 |
ALLOW_ROW_LOCKS | N/A | Durability Level 설정에 따라 정의 |
ALLOW_PAGE_LOCKS | N/A | Durability Level 설정에 따라 정의 |
DATA_COMPRESSION | N/A |
|
CREATE USER
Altibase는 데이터베이스 로그인과 유저를 분리하여 생성하지 않고 하나의 유저로 생성하여 관리한다.
SQL Server | Altibase | 비고 |
---|---|---|
CREATE LOGIN <login_name> WITH PASSWORD = '<password>'; Users based on logins in master CREATE USER user_name [ { FOR | FROM } LOGIN login_name ] [ WITH DEFAULT_SCHEMA = schema_name ] [ ; ] | CREATE USER <user_name> IDENTIFIED BY ‘<password>’ DEFAULT TABLESPACE = tablespace_name |
CREATE INDEX
Altibase는 BTREE와 RTREE INDEX만 제공하고 BITMAP, CLUSTER, Function based, REVERSE, Global partitioned INDEX를 제공하지 않는다.
다음은 Altibase로 변환할 때 CREATE INDEX 구문에 사용하는 옵션들에 대한 변환 방법이다.
SQL Server | Altibase | 비고 |
---|---|---|
UNIQUE | UNIQUE |
|
CLUSTERED | NONCLUSTERED | N/A |
|
ASC | DESC | ASC | DESC |
|
INCLUDE | N/A |
|
filter_predicate | N/A |
|
partition_scheme_name | PARTITION ON | Local Index만 지원 |
ON filegroup_name | N/A |
|
table_or_view_name | Table_name | View는 지원하지 않음 |
PAD_INDEX | N/A |
|
FILLFACTOR | N/A |
|
SORT_IN_TEMPDB | N/A |
|
IGNORE_DUP_KEY | N/A | Altibase는 ON 상태임 |
STATISTICS_NORECOMPUTE | N/A | Alitbase는 OFF 상태임 |
DROP_EXISTING | N/A |
|
ONLINE |
| Alitbase는 OFF 상태임 |
ALLOW_ROW_LOCKS | N/A | Durability Level 설정에 따라 정의 |
ALLOW_PAGE_LOCKS | N/A | Durability Level 설정에 따라 정의 |
MAXDOP | PARALLEL | 생성시에만 적용 |
DATA_COMPRESSION | N/A |
|
SQL Conversion
SQL Server의 SQL 문들을 ALTIBASE로 변환하는 방법을 설명에 대하여 설명한다.
JOIN
Altibase는 ANSI 표준의 JOIN 연산만 제공한다.
SQL Server | Altibase | 비고 |
---|---|---|
INNER JOIN | INNER JOIN |
|
LEFT OUTER JOIN | LEFT OUTER JOIN |
|
RIGHT OUTER JOIN | RIGHT OUTER JOIN |
|
FULL OUTER JOIN | FULL OUTER JOIN |
|
CROSS JOIN | N/A |
|
Execution Query
Altibase의 쿼리 종결 문자는 “;” 이다. 따라서 여러 쿼리를 한번에 실행하려 한다면 쿼리마다 종결문자 “;”로 구분해 주어야 한다.
SQL Server | Altibase | 비고 |
---|---|---|
GO | ; | 기본값은 Autocommit |
Temporary Table
SQL Server | Altibase | 비고 |
---|---|---|
CREATE TABLE #TempProcess | CREATE TABLE TEMP1 (…) TABLESPACE volatile_tablespace_name |
Control Statement
| SQL Server | Altibase |
---|---|---|
IF | If (조건) | If 조건 then |
While | While (조건) | While 조건 loop |
Identity Attribute
Altibase에는 Identity 속성은 존재하지 않는다. 따라서 필요시 SEQUENCE를 만들어 사용한다.
Procedure Conversion
Altibase의 PROCEDRUE 생성 및 실행구문은 SQL 서버와 다른 부분이 있다.
예제를 통하여 PROCEDURE 변경 방법을 확인한다.
Parameter Declaration
SQL Server의 파라미터 선언에서 ‘@’ 기호를 없앤다.
파라미터의 성격에 따라 in , out , in out 을 명시해준다.
Function일 경우 실행 후 하나의 값을 반환해 주는 것으로 반드시 RETURN 다음의 데이터 타입을 명시해야 한다.
SQL Server | Altibase |
---|---|
Variable Declaration
Altibase의 변수 선언은 AS와 BEGIN 사이에서 정의된다.
SQL Server의 변수 선언에서 ‘@’ 기호를 없앤다.
변수 선언 할 때 구분자인 ‘,’를 ‘;’로 바꾼다.
마지막 변수 선언에도 항상 ‘;’로 마지막임을 선언 한다.
SQL Server | Altibase |
---|---|
Assignment
SQL Server의 변수에 값 할당 시 SET 를 이용한다. 여기서 SET, ‘@’ 문자를 없앤다.
그리고 ‘=’ 를 ‘ := ’로 바꾼다.
구분자인 ‘,’를 ‘;’로 바꾸고 마지막에 항상 ‘;’로 마지막임을 선언 한다.
위와 같이 SET 을 명시하여 변수에 값을 할당 할 수도 있다.
SQL Server | Altibase |
---|---|
Control_floe - IF문
Altibase의 문장 끝에는 항상 ‘;’로 마지막임을 표시한다.
IF문 처음에는 IF (condition) THEN으로 처음을 표시한다.
IF문 끝에는 END IF로 IF문이 끝임을 표시한다.
SQL Server | Altibase |
---|---|
SELECT 절
Altibase의 문장 끝에는 항상 ‘;’로 마지막임을 표시한다.
Altibase에서 select의 resultset을 client에 보내기 위해서는 DB 객체에 REF CURSOR 를 먼저 작성해주어야 한다. 그리고 sp의 인자에 ref cursor를 인자로 작성하여야 한다. 그리고 해당 쿼리를 실행할 때 Open이라는 명령어로 실행 한다.
SQL Server의 ‘@’ 문자를 없앤다
SQL Server | Altibase |
---|---|
Exception Handler
Altibase의 문장 끝에는 항상 ‘;’로 마지막임을 표시한다.
Altibase의 Exception Handler는 해당 Exception이 발생했을 때 처리하는 기술이다.
Exception 처리는 항상 BEGIN …. END; 구문 안에서 처리 해야 한다.
시스템 정의 EXCEPTION이나 사용자 정의 EXCEPTION의 이름을 기술하고 해당 Exception을 만날 때 해당 statement를 처리하고, 현재 발생한 Exception을 처리하지 못할 경우 최종적으로 OTHERS 루틴으로 처리 된다.
적용 받은 레코드수가 0인지 체크하는 구문은 SQL%ROWCOUNT상수로 확인 할 수 있다.
시스템 정의 Exception은 파일 마지막에 첨부합니다
SQL Server | Altibase |
---|---|
SP Call
Altibase의 문장 끝에는 항상 ‘;’로 마지막임을 표시한다.
SQL Server의 SP 호출은 exec sp_name 로 호출 하고 sp 인자를 괄호 없이 지정해주지만, Altibase에서 SP_name 을 실행하고 괄호안에 sp의 인자를 명시해준다.
SQL Server의 ‘@’ 문자를 없앤다.
SQL Server | Altibase |
---|---|
Functions
Altibase의 문장 끝에는 항상 ‘;’로 마지막임을 표시한다.
함수별로 사용법은 상이할 수 있고, 함수 명이 다를 수도 있다.
MSSQLl의 ‘@’ 문자를 없앤다.
SQL Server | Altibase |
---|---|
ETC
Altibase의 문장 끝에는 항상 ‘;’로 마지막임을 표시한다.
SQL Server의 ‘@’ 문자를 없앤다.
SQL Server | Altibase |
---|---|
DB Link
Altibase에서 DB Link를 사용시에는 SELECT의 경우 REMOTE_TABLE(dblink명, Query);
DML의 경우 REMOTE_EXECUTE_IMMEDIATE(dblink명, Query); 를 사용한다.
JOIN Update
Altibase에서 Join Update를 처리하기 위해서는 두가지의 방법이 있다.
1. JOIN UPDATE를 사용
- 각 Table에 Primary Key 또는 Unique Key가 존재하여야 한다.
2. Merge Join의 update를 사용.
- Merge into A using ( SELECT … )
WHEN matched then
Update …
Using Cursor
SQL Server의 커서를 Altibase로 변환하는 방법을 예제를 통하여 확인한다.
SQL Server | Altibase |
---|---|
Exception Code
Exception Name | Error Code | Error Code | Error Section |
---|---|---|---|
"CURSOR_ALREADY_OPEN" | 201062 | 31166 | qpERR_ABORT_QSX_CURSOR_ALREADY_OPEN |
"DUP_VAL_ON_INDEX" | 201063 | 31167 | qpERR_ABORT_QSX_DUP_VAL_ON_INDEX |
"INVALID_CURSOR" | 201064 | 31168 | qpERR_ABORT_QSX_INVALID_CURSOR |
"INVALID_NUMBER" | 201065 | 31169 | qpERR_ABORT_QSX_INVALID_NUMBER |
"NO_DATA_FOUND" | 201066 | 3116A | qpERR_ABORT_QSX_NO_DATA_FOUND |
"PROGRAM_ERROR" | 201067 | 3116B | qpERR_ABORT_QSX_PROGRAM_ERROR |
"STORAGE_ERROR" | 201068 | 3116C | qpERR_ABORT_QSX_STORAGE_ERROR |
"TIMEOUT_ON_RESOURCE" | 201069 | 3116D | qpERR_ABORT_QSX_TIMEOUT_ON_RESOURCE |
"TOO_MANY_ROWS" | 201070 | 3116E | qpERR_ABORT_QSX_TOO_MANY_ROWS |
"VALUE_ERROR" | 201071 | 3116F | qpERR_ABORT_QSX_VALUE_ERROR |
"ZERO_DIVIDE" | 201072 | 31170 | qpERR_ABORT_QSX_ZERO_DIVIDE |
"INVALID_PATH" | 201237 | 31215 | qpERR_ABORT_QSX_FILE_INVALID_PATH |
"INVALID_MODE" | 201235 | 31213 | qpERR_ABORT_QSX_INVALID_FILEOPEN_MODE |
"INVALID_FILEHANDLE" | 201238 | 31216 | qpERR_ABORT_QSX_FILE_INVALID_FILEHANDLE |
"INVALID_OPERATION" | 201239 | 31217 | qpERR_ABORT_QSX_FILE_INVALID_OPERATION |
"READ_ERROR" | 201242 | 3121A | qpERR_ABORT_QSX_FILE_READ_ERROR |
"WRITE_ERROR" | 201243 | 3121B | qpERR_ABORT_QSX_FILE_WRITE_ERROR |
"ACCESS_DENIED" | 201236 | 31214 | qpERR_ABORT_QSX_DIRECTORY_ACCESS_DENIED |
"DELETE_FAILED" | 201240 | 31218 | qpERR_ABORT_QSX_FILE_DELETE_FAILED |
"RENAME_FAILED" | 201241 | 31219 | qpERR_ABORT_QSX_FILE_RENAME_FAILED |