informix user guide
TRANSCRIPT
INFORMIX User GuideINFORMIX User Guide
2001. 6
Informix Korea
2INFORMIX User Guide
목차목차
RDB 란 무엇인가 SQL 개요 dbaccess 를 이용한 query 실행 Informix DBMS 의 이해 SQL 을 이용한 질의 방법 DB Admin 작업 ESQL/C 를 이용한 프로그래밍 System Admin 작업 Client/Server Connectivity Data Migration Backup & Restore GLS (Global Language Support)
RDB 란 무엇인가 정보와 데이터 정보시스템 자료처리시스템 데이터베이스의 정의 데이터베이스의 특성 DBMS 발전 배경 데이터 독립성과 데이터 구조간의 사상 데이터베이스 관리시스템 데이터 모델링 관계 데이터 모델 계층 데이터 모델 네트워크 데이터 모델 Primary Key 와 Foreign Key 정규화 (Normalization)
4INFORMIX User Guide
정보와 데이터
데이터 현실 세계 (Real World) 로부터 단순한 관찰이나 측정을 통해서 수집한 사실 (Fact)
또는 값 (Values)
정보 어떤 상황에 관한 어떤 의사 결정을 할 수 있게 하는 지식 (Knowledge) 로써
데이터의 유효한 해석 (Interpretation) 이나 데이터 상호간의 관계(Relationship)
처리기처리기 ((P)P)데이터데이터 ((D)D)데이터데이터 ((D)D) 정보정보 ((I)I)정보정보 ((I)I)
5INFORMIX User Guide
정보 시스템
경영 정보 시스템 (MIS : Management Information System) 군사 정보 시스템 (Military Information System) 행정 정보 시스템 (Administration Information System) 인사 정보 시스템 (Personnel Information System) 의사 결정 지원 시스템 (Decision Support System)
분배의
사
결
정
저장 데이터저장 데이터
수집 입력 출력처리기처리기 ((P)P)데이터데이터 ((D)D)데이터데이터 ((D)D)
정보정보 ((I)I)정보정보 ((I)I)현실 세계현실 세계현실 세계현실 세계
6INFORMIX User Guide
자료 처리 시스템
정보 시스템을 구축 하기 위해 정확한 최신의 정보를 적시에 제공하는 시스템 자료 처리 시스템의 종류
일괄 처리 시스템 (batch Processing) 온라인 처리 시스템 (on-line processing) 분산 처리 시스템 (distributed processing)
7INFORMIX User Guide
데이터베이스의 정의
데이터베이스란 어느 한 조직의 다수 응용 시스템들이 사용하기위해 통합 , 저장된 운영 데이터의 집합
통합된 데이터 (Integrated Data) 최소의 중복 , 통제된 중복 허용
저장된 데이터 (Stored Data) 운영 데이터 (Operational Data)
존재 목적이 뚜렷하고 필수 적인 데이터 공용 데이터 (Shared Data)
8INFORMIX User Guide
데이터 베이스의 특성
실시간 접근성 (Real Time Accessibility) 수시적이고 비 정형적인 데이터의 검색이나 처리를 요구하는 질의 질의 (Queries) 에 대하여 실시간에 처리 응답
계속적인 변화 (Continuous Evolution) 데이터의 삽입 , 삭제 , 갱신을 통하여 가장 최근의 정확한 데이터를 유지
동시 공유 (Concurrent Sharing) 동시에 여러사용자가 접근 이용 가능
내용에 의한 참조 (Content Reference) 데이터 레코드들은 주소나 위치에 의해 참조되는 것이 아니라 데이터의 내용 즉 ,
어떤 특정 조건을 만족하는 레코드들은 모두 하나의 논리적 단위로 취급되고 접근
9INFORMIX User Guide
DBMS 발전 배경
데이터의 종속성 데이터의 중복성 내부적 일관성 (Consistency)
보안성 (Security) 경제성 (Economics) 무결성 (Integrity)
데이터의 독립성 논리적 데이터 독립성 물리적 데이터 독립성
10INFORMIX User Guide
데이터 독립성과 데이터 구조간의 사상
ABCD
BEF
GAC
논리적
구조
사상
A
B
C
D
E
F
G
H
A B CD E FG H ...
물리적데이터베이스
프로그램 데이터 구조 데이터베이스 논리적 구조
응용 프로그램 1
응용 프로그램 2
응용 프로그램 3
물리적
구조
사상
11INFORMIX User Guide
데이터베이스 관리시스템
응용 프로그램과 데이터의 중재자로써 모든 응용 프로그램들이 데이터베이스를 공용할 수 있게끔 관리해 주는 소프트웨어 시스템 정의 기능
데이터베이스의 논리적 구조와 그 특성을 어떤 데이터 모델에 따라 명세 데이터베이스의 물리적 구조를 명세 물리적 구조와 논리적 구조의 변환이 가능하도록 사상 (mapping) 을 명세
조작 기능 데이터 처리가 간편하고 쉬우며 명확하고 완전하고 효율적
제어 기능 데이터 무결성 제어 보안과 권한을 검사 동시성 제어 (Concurrency Control)
12INFORMIX User Guide
데이터 모델링
객체 ( 그룹 )성 질
값
객체 ( 그룹 )성 질
값
엔티티 타입엔티티 타입에트리뷰트에트리뷰트
값값
레코드레코드데이터 필드데이터 필드
값값
현실 세계 ( 실체 ) 개념 세계 ( 정보 ) 컴퓨터 세계 ( 데이터 )
현실 세계현실 세계 개념 세계개념 세계개념 세계개념 세계
데이터 모델데이터 모델데이터 모델데이터 모델물리적 물리적 데이터베이스데이터베이스
물리적 물리적 데이터베이스데이터베이스
일치성일치성
데이터구조화데이터구조화
컴퓨터 세계컴퓨터 세계
데이터데이터모델링모델링
정보 모델링정보 모델링
13INFORMIX User Guide
관계 데이터 모델
현실 세계를 ER 다이어 그램으로 표현한 것은 현실 세계를 사람이 이해할 수 있게 표현한 논리적 구조
현실 세계현실 세계 ERER다이어그램다이어그램
데이터데이터모델모델
저장 저장 데이터베이스데이터베이스
학번
1234
1235
1246
1248
1225
이름
김철수이상철박영수조성진강신조
학년
3
4
3
3
1
학과
전산전산전자전기산공
학생학생
과목 번호
CS312
CS322
CS412
과목이름
자료 구조파일 처리
데이터베이스
학점
3
3
3
교과목교과목
학번
1235
1246
1234
1235
1248
1234
1235
1246
과목 번호
CS312
CS312
CS322
CS322
CS322
CS412
CS412
CS412
성적
90
85
88
95
94
98
75
80
수강수강
14INFORMIX User Guide
계층 데이터 모델
홍수영홍수영
CS 421.2CS 421.2
교과목교과목
선수 과목선수 과목 강 좌강 좌
교 수교 수 학 생학 생
데이터베이스데이터베이스
파일 처리론파일 처리론 CS 421.1CS 421.1
이상길이상길 김철수김철수
15INFORMIX User Guide
C
네트워크 데이터 모델
1000, 갑 , 경영 , 41000, 갑 , 경영 , 4
2000, 을 , 전산 , 32000, 을 , 전산 , 3
3000, 병 , 영문 , 23000, 병 , 영문 , 2
A
B
D
A
B
C
영어 , 4영어 , 4
역사 , 3역사 , 3
음악 , 2음악 , 2
16INFORMIX User Guide
Primary Key 와 Foreign Key
Primary Key 각 개체를 유일하게 구분할 수 있는 속성 혹은 속성의 조합 . Primary 는 반드시 존재하는 값이어야 한다 . 모든 개체는 하나의 primary key 를 가져야 한다 . 예
고객 개체 : 주민번호 상품 개체 : 상품 코드 , 제조업체 학생 개체 : 학번
Foreign Key 다른 개체의 primary key 를 참조해야 하는 개체의 속성 개체 간에 관계를 설정하기위해 사용되는 속성 혹은 속성의 집합 값이 없어도 가능 중복된 값 가능 수정 가능 예
주문 개체의 주문 고객 속성 고객 개체의 고객번호 수강 개체의 수강 학생 속성 학생 개체의 학번
17INFORMIX User Guide
정규화 - 1NF(First Normal Form)
엔티티 (entity) 안에 반복되는 속성 그룹을 제거한다
주문번호주문날짜총액항목번호 1항목수량 1항목번호 2항목수량 2항목번호 3항목수량 3항목번호 4항목수량 4
주문번호주문날짜총액항목번호 1항목수량 1항목번호 2항목수량 2항목번호 3항목수량 3항목번호 4항목수량 4
주문주문
반복되는 속성은 데이터를 유연하게 저장할 수 없다 .여기서 , 항목은 최대 4 개밖에 저장할 수 없다
주문번호항목번호수량주문날짜총액지불날짜
주문번호항목번호수량주문날짜총액지불날짜
주문주문
compositeprimary key
18INFORMIX User Guide
정규화 - 2NF(Second Normal Form)
1NF 에서 모든 속성은 전체 Primary Key 에 종속되어야한다 엔티티의 모든 속성은 Primary Key 에 functionally dependent
해야한다 데이터항목 a 가 데이터항목 b 에 의해 정의될 수 있다면 a 는 b 에
functionally dependant 하다고 한다
주문번호항목번호수량주문날짜총액지불날짜
주문번호항목번호수량주문날짜총액지불날짜
주문주문
주문날짜 , 총액 , 지불날짜는 단지 주문번호에만 functionally dependant 하다
주문번호 1010 1010 1011항목번호 1 2 3수량 20 3 12주문날짜 1/4/2001 1/4/2001 1/4/2001총액 50,000 50,000 50,000지불날짜 2/4/2001 2/4/2001 2/4/2001
1010항목의 지불날짜가 바뀌면 모든 1010항목을 수정해야 한다
주문번호주문날짜총액지불날짜
주문번호주문날짜총액지불날짜
주문마스터주문마스터
주문번호항목번호수량
주문번호항목번호수량
주문상세주문상세
19INFORMIX User Guide
정규화 - 3NF(Third Normal Form)
Primary Key 에 종속적인 Key 가 아닌 속성에 종속적인 속성이 있으면 안된다 .
어떠한 속성도 Primary Key 에 transitively dependent 하면 안된다 . 데이터항목 a 가 다른 데이터항목 b 에 종속적이면 a 는 b 가 종속적인 다른
데이터 항목에도 함께 종속적인 관계가 되고 이를 transitively dependent하다고 말한다
주문번호항목번호품목번호제조코드수량단가
주문번호항목번호품목번호제조코드수량단가
주문가격주문가격
주문번호 1010 1010 1011항목번호 1 2 1품목번호 1 30 1제조코드 ABC XYZ ABC수량 20 3 12단가 1,000 3,500 1,000
주문하지 않은 항목에 대한 단가를 입력할 수 없다항목을 포함한 주문이 삭제되면 그 항목의 단가를 잃는다단가는 중복적으로 저장된다단가가 변경되면 그 항목을 포함한 모든 주문에 대해서 변경해야 한다
주문번호항목번호품목번호제조코드수량
주문번호항목번호품목번호제조코드수량
주문주문
품목번호제조코드단가
품목번호제조코드단가
품목품목
SQL 개요 SQL 이란 무엇인가 SQL 의 종류 DB 내의 object 이름 규칙 인포믹스 자료형 (Data Type) Character Data Type Numeric Data Type Large Object Data Type Time Data Type Row Data Type Collection Data Type Complex Data Type
21INFORMIX User Guide
SQL 이란 무엇인가 ?
Structured Query Language 의 준말 영어와 흡사한 언어 Database 와의 관련 작업을 가능하게 함 . 논리적인 database 의 model 을 관계형 DB 의 schema 로 번역하는데
사용되는 언어 . schema 란 - DB 내에서의 table 의 물리적인 정의 table 이란 - 열과 행으로 이루어진 2 차원 표현
22INFORMIX User Guide
SQL 의 종류
DDL(Data Definition Language) DB 나 table 을 생성하고 , 그 구조를 수정하는 작업관련 구문
DML(Data Manipulation Language) Data 를 가져오고 , 수정하고 , 삭제하는 등의 Data 를 사용하는데 사용되는 구문
Cursor Manipulation Cursor 를 사용하는데 사용되는 구문
Dynamic Management 동적으로 자원을 사용 , 관리하는데 사용되는 구문
Data Access Data 에 대한 권한을 설정하고 , lock 을 거는등의 작업에 사용되는 구문
Data integrity Transaction 을 관리하는데 사용되는 구문
Query optimization 질의 최적화에 사용되는 구문
Stored procedure Stored procedure 를 실행하는 작업에 사용되는 구문
23INFORMIX User Guide
DB 내의 object 이름 규칙
Informix version 에 따라 길이 제한이 다름 . Informix 7.*,8.* ,9.1*: 18글자 ( 영문기준 ) Informix 9.2* : 128글자 ( 영문기준 )
숫자로 시작하면 안됨 . 특수문자의 사용 불가
예 : 공백문자 , tab 문자 , 등… “_ ” 는 사용 가능 ANSI-reserved word 사용 안됨 .
24INFORMIX User Guide
인포믹스 자료형 (data type)
Built-in Data Type
User-defined Data Type
Complex Data Type
Character
Numeric
Large-object
Time
boolean
char
varchar
lvarchar
Exact
Approximate
decimal/numeric
money
integer/int
smallint
int8
serial
serial8
decimal
float
real
byte
text
blob
clob
date
datetime
interval
Opaque Data Type
Distinct Data Type
Row Type
Collection Type
Named Row Type
Unnamed Row Type
set
list
multiset
25INFORMIX User Guide
Character Data Type
char (size) 고정 길이 문자 저장 1~ 32,767 byte까지의 character 저장 가능 default 값은 1
varchar (max, reserve) 가변 길이 문자 저장 1~ 255 byte까지 가능 Reserve(default 로 0 ) 는 option 이나 Max 는 반드시 주어야 함 .
lvarchar 2K까지의 가변길이 문자를 저장
26INFORMIX User Guide
Numeric Data Type
decimal (precision,scale) or numeric (precision,scale) 고정 소수점 실수를 저장 ,32 유효자리수까지 표현 default 자리수 : 16, default 소수점이하 : 0
money (precision, scale) 내부적으로 decimal 과 같으나 , 화폐단위기호가 붙어서 출력됨 .
integer or int 4bytes integer 저장 : -(231-1) ~ 231-1
int8 8bytes integer 저장 : -(263-1) ~ 263-1
smallint 2bytes integer 저장 : -(215-1) ~ 215-1
serial (start) / serial8 (start) 서버에 의해 자동적으로 1씩 증가되는 값을 저장할 수 있는 type. 내부적으로 int 와 같음 .
27INFORMIX User Guide
Numeric Data Type
float or double precision 부동 소수점 실수를 저장 유효자리수 16까지 표현 가능
real or smallfloat 부동 소수점 실수를 저장 유효자리수 8 까지 가능
28INFORMIX User Guide
Large-Object Data Type
Large-Object data type text
2G 까지의 ASCII character 형식의 object 를 저장 byte
2G 까지의 binary character 형식의 object 를 저장
Smart Large Object data type clob
4T까지의 ASCII character 형식의 object 를 저장 blob
4T까지의 binary character 형식의 object 를 저장
29INFORMIX User Guide
Time Data Type
date 연 ,월 , 일의 날짜를 저장 Format 을 정의할 수 있음 .(default : mm/dd/yyyy) 환경변수 DBDATE 를 이용해 변경
datetime 날짜를 시간까지 저장할 수 있음 . default : yyyy-mm-dd hh:MM:ss.fff
interval 시간의 간격 ( 기간 ) 을 저장할 수 있음 .
30INFORMIX User Guide
Row Data Type
C 언어의 구조체와 유사한 여러 종류의 데이터의 모음 Unnamed Row Data Type
create table part ( part_id serial , cost decimal,
part_dimensions row (length decimal, width decimal, height decimal, weight decimal) );insert into part values (0, 10.00, row(1.0, 2.0, 3.0, 4.0));
Named Row Data Typecreate row type dimension_t ( length decimal, width decimal, height decimal, weight decimal);create table part ( part_id serial, cost decimal, part_dimensions
dimension_t);insert into part values (0, 10.00, row(1.0, 2.0, 3.0, 4.0)::dimension_t;
Row Data Type 데이터 조회select part_id, cost, part_dimensions from part where part_dimensions.weight > 100;
constructor Cast operator Row data type
31INFORMIX User Guide
Collection Data Type
Set 데이터 입력 순서에 의미 없고 , 중복된 값을 허용하지 않음
alter table part add (defective_dates set(date not null));insert into part (part_id, defective_dates) values (0,(set{2/23/2001,3/15/2001}));select * from part where ‘1/26/2001’ in defective_dates;
MultiSet 데이터 순서에 의미 없고 , 중복된 데이터를 허용함
List 데이터 순서가 의미 있고 , 중복된 데이터를 허용함
32INFORMIX User Guide
Complex Data Type
User-defined Data Types (UDTs) 라고 부른다 Distinct Types
기존에 존재하는 데이터형을 기반으로한 새로운 데이터형을 나타낸다create distinct type inches as decimal;create row type dimension_t ( length inches, width inches, . . . );
Opaque Data Types C 언어나 JAVA 를 이용하여 데이터형의 내부 구조와 함수를 정의한다 Create Opaque Type 문을 이용하여 새로운 데이터형을 등록한다 Create Function 문을 사용하여 이 데이터형을 지원하는 함수를 등록한다
dbaccess 를 이용한 query 실행 dbaccess 란 ? dbaccess 실행 dbaccess 의 메뉴 구조 dbaccess 의 실행방법
34INFORMIX User Guide
Dbaccess 란 ?
Query 를 실행하고 , db 나 table 에 대한 information 을 볼 수 있는 tool
35INFORMIX User Guide
Dbaccess 실행
$ dbaccess
메뉴의 사용법 Space-bar 를 이용하거나 화살표키로 이동 혹은 각 메뉴의 대문자로 쓰여진 문자를 누름
예 : Exit 의 경우 “ e” 를 누름
36INFORMIX User Guide
Dbaccess 의 메뉴구조
Query Language Connection Database Table Session Exit
NewRunModifyUse-EditorOutputSaveInfoDropExit
ConnectDisconnectExit
SelectCreateInfoDropcLoseExit
CreateAlterInfoDropExit
NEW dbaccess editor 에서 SQL 문장을 작성한다 , 작성이 끝나면 ESC키를 눌러야 메뉴로 돌아간다 RUN 작성된 SQL 문장을 실행한다 MODIFY dbaccess editor 에서 SQL 문장을 수정한다 USE_EDITOR vi editor 를 호출하여 SQL 문장을 작성 및 수정한다 . 작성이 끝나면 저장하고 vi 를 종료한다 OUTPUT 출력결과를 파일로 저장한다 SAVE editor 에 기록되어 있는 SQL 문장을 파일로 저장한다 ( 확장자 : .sql) INFO 현재 연결된 데이터베이스의 테이블 정보를 본다 DROP 현재 디렉토리에 저장된 SQL 파일 ( 확장자 : .sql) 을 삭제한다 EXIT Query Language 종료
37INFORMIX User Guide
Dbaccess 의 실행 방법
구문을 적은 file 을 명령 프롬프트에서 바로 실행하여 결과를 볼 수 있다 . Shell program, cron job등에 응용 가능 dbaccess DB 이름 SQL 파일명
dbaccess test_db test.sql
Interactive mode 로 prompt 상에서 실행한다 SQL 문장 끝에 세미콜론 (;) 을 넣어야 실행된다 종료는 interrupt 키를 눌러 빠져나온다
dbaccess test_db - > select * from customer;
여러 문장을 그룹으로 프롬프트에서 실행한다 새 입력 라인 첫 자리에 종료 문자가 나타날때까지 문장을 입력 받는다
dbaccess test_db << !> select * from customer;> select * from state;!
Informix DBMS 의 이해 Informix DBMS 의 아키텍쳐 Database Server 의 구성요소 물리적인 저장 공간 논리적인 저장 공간 물리적 디스크 공간 할당 논리적 디스크 공간 할당 SYSMASTER 데이터베이스 데이터베이스 구조
39INFORMIX User Guide
Informix DBMS 의 아키텍쳐
Multi-threaded 구조 적은 프로세스 소요 여러 프로세스가 하나의 어플리케이션을
위하여 작업 서버 프로세스 안에서 thread
scheduling 과 context switching
process process process
Client/Server 구조 client 는 server 에게
command 나 query 를 보내고 결과를 받는다
server 는 데이터베이스의 컨텐츠를 관리하며 client 가 보낸 query 를 해석하고 실행하여 결과를 client 에게 보낸다
ClientClient ServerServer
SQL
results
•interpret•execute•return
applicationapplication
ServerServer
40INFORMIX User Guide
Database Server 의 구성 요소
Resident Portion
ProcessesProcessesChunkPageExtentTblspaceDbspaceBlobspaceSmart BlobspacePhysical Log, Logical Log
Virtual Portion
MessagePortion
Shared MemoryShared Memory
DiskDisk
Lock, LRU, Buffer Pool,Logical log buffer,Physical Log Buffer..
MT, Sort, Session,Procedure, Dictionary,Big buffer, Global..
Virtual Processors(CPU, PIO, LIO, AIO, ADT, MSC, SHM, TLI, SOC, ADM, OPT, JVP..)
V.P 는 자체적으로 thread 를 scheduling 하고 실행한다
빠른 access 를 위하여 disk 로부터 데이터를 cache 하는 영역
사용자 세션 관리 client 와 server 간의 통신 영역
checkpoint
메모리와 디스크 데이터의 동기화 작업
환경변수 : INFORMIXSERVER, INFORMIXDIR, PATH
41INFORMIX User Guide
물리적인 저장 공간
Page IDS 의 기본적인 I/O 의 단위 CHUNK 를 구성하는 최소 단위 . 메모리 버퍼의 사이즈와 동일 Size : 2K 혹은 4K
Extent Table 이나 index, fragment 에 저장영역을 할당하는 단위로서 , 연속된 페이지의 묶음 .
Chunk Informix 에 할당된 연속된 disk 의 공간 Raw device 나 cooked device(file) 가능
42INFORMIX User Guide
논리적인 저장공간
Tblspaces Table 에 할당된 extent 의 묶음 하나의 dbspace 에만 존재가능
Dbspaces Informix 가 사용하는 저장 공간으로 하나 이상의 Chunk 로 구성됨 .
dbspacedbspace
/dev/rvol1
/dev/rvol2/usr/ifmxdata
Tab1 의 tablespace
Tab2 의 tablespace
43INFORMIX User Guide
물리적인 디스크 공간 할당
create table first_table (tab_id int ,name char(20) ,address char(50)
) extent size 32 next size 16;
create table second_table (tab_id int ,name char(20) ,address char(50)
) extent size 16 next size 8;
…………
page
first_table
second_table
44INFORMIX User Guide
논리적 디스크 공간 할당
create database example1db;create database example2db in dbspace1;create table first_table (
tab_id int ,name char(20) ,address char(50)
) ;create table second_table (
tab_id int ,name char(20) ,address char(50)
) in dbspace2;
rootdbs
dbspace1
dbspace2
example1db
example2db
second_table
first_table
45INFORMIX User Guide
SYSMASTER 데이터베이스
Informix 서버의 정보를 저장 Informix 서버가 초기화 되는 시점에 자동 생성 공유메모리의 실제 데이터를 접근 (access)
shared memoryshared memory
processprocess
sysmastersysmaster
SELECT dbsnum, name, owner, nchuncks, is_temp, is_blobspace, flagsFROM sysdbspaces
SELECT c.dbsnum, chknum, nxchknum, d.name, chksize, nfreeFROM syschunks c, sysdbspaces cWHERE c.dbsnum = d.dbsnumAND d.name = “dbspace 이름”
SELECT name, owner, created, is_logging, is_buff_log, is_ansiFROM sysdatabases
SELECT partnum, dbsnum, owner, tabnameFROM systabnamessWHERE dbsname = “DB이름”
SELECT sid, username, uid hostname, connectedFROM syssessions
46INFORMIX User Guide
데이터베이스 구조 (1)
시스템 카타로그 테이블 (system catalog table) 데이터베이스의 구조에 대한 정보를 저장 데이터베이스가 생성되는 시점에 자동적으로 생성 데이터베이스내의 테이블 구조가 변경되는 시점에 자동으로 수정
데이터 테이블 테이블을 생성할 때 고려할 사항
dbspace : 테이블이 생성될 위치 extent/next size : 연속으로 할당할 공간의 크기 lock mode : row 또는 page 단위의 locking 사용
인덱스 데이터를 빠르게 접근하기 위한 정보를 저장 인덱스의 종류
데이터 중복 여부에 따라 unique / duplicate 인덱스로 구분 여러 컬럼을 인덱스 키로 사용하는 composite 인덱스 인덱스 생성 시 데이터의 물리적 위치를 재 정렬시키는 cluster 인덱스
47INFORMIX User Guide
데이터베이스 구조 (2)
제약조건 (Constraints) Referential constraint : 테이블간의 integrity 보장 Default values : 입력 내용이 없을 경우 지정한 기본값 저장 NOT NULL constraint : null 값을 허용하지 않는 컬럼 지정 Check constraint : 입력 , 수정시 허용하는 컬럼 값을 지정 Unique constraint : 컬럼값이 테이블안에서 유일
뷰 (view) 테이블 실제 테이블에서 데이터를 가져오는 가상의 테이블
Stored Procedure 사용자가 정의한 함수 데이터베이스 안에 저장되는 로직
Trigger 테이블에 이벤트 발생시 자동적으로 실행
48INFORMIX User Guide
데이터베이스 구조 (3)
dbschema utility 데이터베이스의 구조를 파악할 수 있는 유틸리티 사용법
dbschema -d <DB 이름 > dbschema -d <DB 이름 > -t <table 이름 > dbschema -d <DB 이름 > -s <synonym 이름 > dbschema -d <DB 이름 > -f <procedure 이름 >
table 이름 , synonym 이름 , procedure 이름 대신 “ all” 을 사용하면 지정한 데이터베이스 내의 모든 table, synonym, procedure 에 대한 정보를 출력한다
옵션뒤에 파일 이름을 명시하면 실행결과가 파일로 저장된다 -ss 옵션을 추가하면 테이블의 lock mode, extent, space 정보 등을 자세히 출력한다 .
SQL 을 이용한 질의 방법 SQL 질의 작성 방법 DML 문의 종류 SELECT SELECT 의 예 SQL 실행 경로 확인 INSERT, UPDATE, DELETE Concurrency Control SPL SPL 생성 및 실행 SPL 구문 Trigger
50INFORMIX User Guide
SQL 질의 작성 방법
구문 ( 구문 , 테이블이름 , 컬럼이름등 ..) 은 대 소문자 상관 없다 . 질의의 내용이 아닌 주석의 경우
줄단위로는 “ --”를 이용하고 단락단위로는 “ { }”를 이용한다 .
문자를 입력하거나 , 비교할때에는 인용부호가 필요하다 . 조건의 대상이되는 문자열의 경우 대소문자를 구별한다 .
“CA” ,”ca”, “Ca” 는 모두 다르다 . 한 문장은 “ ;”로 끝난다 .
51INFORMIX User Guide
DML 문의 종류
SELECT 테이블내의 자료를 가져옴 . Row, column 단위
INSERT 테이블내에 새로운 자료를 입력 Row 단위
UPDATE 테이블내의 자료를 갱신 Column 단위
DELETE 테이블내의 자료를 삭제 Row 단위
52INFORMIX User Guide
SELECT
문법
Select 가져올 컬럼 리스트From 테이블 이름Where 가져올 조건Group by 그룹으로 만들 대상 컬럼Having 그룹내의 가져올 조건Order by 정렬 기준 컬럼Into temp 임시테이블의 이름
53INFORMIX User Guide
Select 의 예 (1)
SELECT * FROM customer;Select *From table_name;
S Y N T A XS Y N T A X
Select distinct 컬럼이름From table_name;
S Y N T A XS Y N T A X
테이블의 모든 컬럼을 가져온다 .
테이블의 특정 컬럼중 유일한 값만을 가져 온다 .
SELECT distinct customer_num FROM orders
54INFORMIX User Guide
Select 의 예 (2)
SELECT phone[2,3] FROM customer;
Output :Phone081112
Select column [ first, last ]From table_name;
S Y N T A XS Y N T A X
Select substr(column,first,n)From table_name;
S Y N T A XS Y N T A X
테이블의 특정 컬럼의 first 부터 last까지를 가져온다 .
테이블의 특정 컬럼의 first 부터 n 개의 문자를 가져온다 .
SELECT substr(phone,2,3) FROM customer;
Output :(expression)789822328
55INFORMIX User Guide
Select 의 예 (3) – where 조건 적용
SELECT stock_num, manu_code, unit FROM stock WHERE unit != ‘case’;
stock 테이블 중 unit컬럼 값이 case인 것만
가져온다 .
Select . . .From . . .Where [ 조건 ]
특정 row 를 가져옴 .join 의 조건
S Y N T A XS Y N T A X
SELECT stock_num, manu_code, unit FROM stock WHERE unit != ‘case’;
stock 테이블 중 unit컬럼 값이 case가 아닌 것만 가져온다 .
56INFORMIX User Guide
Select 의 예 (3-1) – where 조건 적용
SELECT * FROM customer WHERE customer_num in (118,114,106);
Select . . .From . . .Where 컬럼 in ( 값 , 값 . . . );
S Y N T A XS Y N T A X
Select . . .From . . .Where 컬럼 between A and B;
S Y N T A XS Y N T A X
테이블의 컬럼이 값들중에 있다면 모두 가져온다 .
테이블의 컬럼이 A 와 B 사이인것을 가져온다 .
SELECT * FROM stock WHERE unit_price between 20.00 and
30.00;
57INFORMIX User Guide
Select 의 예 (3-2) – where 조건 적용
SELECT * FROM customer WHERE address2 is null;
Select . . . From . . . Where 컬럼 is null ;
S Y N T A XS Y N T A X
Select . . . From . . . Where 컬럼 is not null ;
S Y N T A XS Y N T A X
테이블의 컬럼이 null 값인것을 가져온다 .
테이블의 컬럼이 null 값이 아닌것을 가져온다 .
SELECT * FROM customer WHERE address2 is not null;
58INFORMIX User Guide
Select 의 예 (3-3) – where 조건 적용
SELECT * FROM customer WHERE phone[1,3] matches ‘415’;SELECT * FROM customer WHERE company matches ‘*City*’;
Select . . . From . . .Where 컬럼 matches ‘* 값 *’;
S Y N T A XS Y N T A X
Select . . . From . . .Where 컬럼 like ‘% 값 %’;
S Y N T A XS Y N T A X
테이블의 컬럼에 값을 포함한 것을 가져온다 .
테이블의 컬럼에 값을 포함한 것을 가져온다 .
SELECT customer_num , company FROM customer WHERE company like ‘City%’;
59INFORMIX User Guide
Select 의 예 (4) – 정렬
SELECT stock_num, manu_code FROM stock ORDER BY stock_num;
stock 테이블의 row 를 stock_num 순서로 가져온다 .
Select . . .From . . .Order by 컬럼 ;
S Y N T A XS Y N T A X
SELECT stock_num, manu_code FROM stock ORDER BY stock_num desc;
stock 테이블의 row 를 stock_num 내림 순서로 가져온다 .
60INFORMIX User Guide
Select 의 예 (5) – 조건식의 사용
CASEWHEN condition1 THEN result1WHEN condition2 THEN result2. . .ELSE resultnEND
S Y N T A XS Y N T A X
조건에 따라 다른값을 출력한다 .
SELECT title, CASE movie_type WHEN 1 THEN ‘HORROR’ WHEN 2 THEN ‘COMEDY’ WHEN 3 THEN ‘ROMANCE’ WHEN 4 THEN ‘WESTERN’ ELSE ‘UNCLASSIFIED’ END, our_cost FROM movie_titles;
61INFORMIX User Guide
Select 의 예 (5-1) – 조건식의 사용
NVL(value1, value2)
S Y N T A XS Y N T A X
value1 이 null 값이면 value2 를 출력한다 .
SELECT fname, NVL(addr, “Address is missing”) as address FROM employees;
Input :fname addressPeter 3318 RockdalePaul NULL
Output :fname addressPeter 3318 RockdalePaul Address is missing
62INFORMIX User Guide
Select 의 예 (5-2) – 조건식의 사용
DECODE(value1, value2, value3, value4, . . . valuen)
S Y N T A XS Y N T A X
value1 이 value2 이면 value3 을 return 하고 ,value4 이면 value5 를 return 하고 ,아니면 valuen 을 return 한다 .
SELECT DECODE (city, “Menlo Park”, “local”, “Palo Alto”, “Tall Tree”, city) city FROM customer;
Input :cityMenlo Park Santa ClaraPalo AltoSan Francisco
Output :cityLocalSanta ClaraTall TreeSan Francisco
63INFORMIX User Guide
Select 의 예 (6) – function 의 사용
today current
S Y N T A XS Y N T A X
오늘 날짜를 return 한다 .today : 연 ,월 , 일current : 연 ,월 , 일 , 시 , 분 ,초 , 각
CREATE TABLE new_acct ( col1 int, col2 datetime year to day default current year to day );DELETE FROM cust_calls WHERE res_dtime < CURRENT YEAR TO MINUTE;SELECT * FROM orders WHERE DAY(ord_date)<DAY(CURRENT);SELECT * FROM cust_calls WHERE call_dtime BETWEEN ‘1997-1-1 00:00:00’ AND CURRENT;
UPDATE orders SET order_date = TODAY WHERE order_num = 1005;INSERT INTO orders VALUES (0, TODAY, 120, NULL, NULL, NULL);
64INFORMIX User Guide
Select 의 예 (6-1) – Algebraic
ABS ( num_expression )MOD ( dividend, divisor )POW ( base, exponent )ROOT ( radicand, index ) default index:2ROUND ( expr, factor ) default factor:0SQRT ( sqrt_radicand )TRUNC ( expr, factor ) default factor:0
S Y N T A XS Y N T A X
SELECT * FROM orders WHERE ABS(ship_charge) > 20;SELECT MOD(today-mdy(1,1,year(today)),30) FROM orders;SELECT * FROM circle WHERE (3.14 * POW(radius,2)) < 1000;SELECT ROOT(9) FROM square;SELECT ROOT(64,3) FROM cube;SELECT SQRT(9) FROM angles;
65INFORMIX User Guide
Select 의 예 (6-2) – Log,hex,length
EXP (float_expression)LOGN (float_expression)LOG10 (float_expression)HEX (expression)LENGTH(expression)
S Y N T A XS Y N T A X
SELECT EXP(3) FROM angles;SELECT LOGN(population) FROM history ORDER BY date;SELECT LOG10(distance) +1 digits FROM travel; SELECT tabname, HEX(partnum) FROM systables;SELECT HeX(order_num + 1) FROM orders;SELECT LENGTH(fname) + LENGTH(lname), LENGTH(‘How many bytes ?’) FROM customer;
66INFORMIX User Guide
Select 의 예 (6-3) – time
DATE (non_date_expr)DAY (date/datetime_expr)MONTH (date/datetime_expr)WEEKDAY (date/datetime_expr)YEAR (date/datetime_expr)EXTEND (datetime_expr, first to last)MDY (month, day, year)
S Y N T A XS Y N T A X
SELECT * FROM order1. WHERE order_date<DATE(‘12/31/99’);2. WHERE order_date < DATE(365);3. WHERE DAY(order_date) > DAY (CURRENT);SELECT order_num, MONTH(order_date) FROM orders;SELECT * FROM orders WHERE WEEKDAY(paid_date) = WEEKDAY(CURRENT);SELECT order_num FROM orders WHERE YEAR(ship_date) < YEAR(TODAY);Date(365) = 12/31/1899+365day = 12/31/1900
WEEKDAY 는 일요일을 0으로 시작하여 각 요일을 나타낸다 0 : Sunday, 1 : Monday, …
67INFORMIX User Guide
Select 의 예 (6-4) – time
TO_DATE (String [,fmt] )TO_CHAR (String [,fmt] )
S Y N T A XS Y N T A X
SELECT TO_CHAR(begin_date, ‘%A %B %d, %Y %R’) FROM tab1;UPDATE tab1SET begin_date = TO_DATE (“Wednesday February 07, 01 14:17”, “%A %B %d, %Y %R”);
Input :begin_date2001-02-07 14:17
Output :begin_dateWednesday February 07, 01 14:17
%AThe full weekday name as defined in the locale
%BThe full month name as defined in the locale
%dThe day of the month as a decimal number
%Y The year as a 4-digit decimal number
%R The time in 24-hour notation
68INFORMIX User Guide
Select 의 예 (6-5) – trigonometric
COS/SIN/TAN (radian_expr)ASIN/ACOS/ATAN (numeric_expr)ATAN2 (y,x)
S Y N T A XS Y N T A X
SELECT COS(degrees*180/3.14) FROM anglestb1;SELECT SIN(radians) FROM anglestb1;SELECT TAN(radians) FROM anglestb1;SELECT ACOS(-0.73) FROM anglestb1;SELECT ASIN(-0.73) FROM anglestb1;SELECT ATAN(-0.73) FROM anglestb1 WHERE angles > ATAN2(4,5);
69INFORMIX User Guide
Select 의 예 (6-6) – string
TRIM ( source_expr)TRIM ({ LEADING|TRAILING|BOTH } [trim_expr] FROM source_expr)TRIM ( trim_expr FROM source_expr)
S Y N T A XS Y N T A X
SELECT TRIM(c1), TRIM(TRAILING ‘#’ FROM c1), TRIM(LEADING FROM c1) FROM tab;UPDATE c1 = ‘xyz’ FROM tab WHERE LENGTH(TRIM(c1))=5;SELECT c1, TRIM(LEADING ‘#’ FROM TRIM(TRAILING ‘%’ FROM ‘###abc%%%’)) FROM tab;
70INFORMIX User Guide
Select 의 예 (6-7) – string
REPLACE(string,old [,new] )
S Y N T A XS Y N T A X
SELECT REPLACE(‘Mighxzy xzime’,’xz’,’t’) FROM mytable;
Output :(constant)Mighty time
string 의 old 값을 new 로 대체한다 .
71INFORMIX User Guide
Select 의 예 (6-8) – string
LPAD(string,length [,pad] )RPAD(string,length [,pad] )
S Y N T A XS Y N T A X
SELECT LPAD(‘Here we are’,16,’-_’ ) FROM mytable;SELECT RPAD(‘Where are you’,18,’?!’) FROM mytable;
Output :(constant)-_-_-Here we are
(constant)Where are you?!?!?
왼쪽이나 오른쪽에 특정 문자를 채워 Length 만큼의 문자열을 만든다 .
72INFORMIX User Guide
Select 의 예 (6-9) – string
UPPER (column or string)LOWER(column or string)INITCAP (column or string)
S Y N T A XS Y N T A X
SELECT city, LOWER(city), UPPER(city), INITCAP(city) FROM weather WHERE UPPER(city) = “SUNNYVALE”;
Output :citysunnyVale
city (constant) (constant) (constant)sunnyVale sunnyvale SUNNYVALE Sunnyvale
UPPER : 모두 대문자로LOWER : 모두 소문자로INITCAP : 처음 문자만 대문자로
73INFORMIX User Guide
Select 의 예 (6-10) – aggregate
COUNT(*)AVG ( [DISTINCT|UNIQUE] column)MAX ( [DISTINCT|UNIQUE] column)MIN ( [DISTINCT|UNIQUE] column)SUM ( [DISTINCT|UNIQUE] column)COUNT([DISTINCT|UNIQUE] column)RANGE (expr)STDEV (expr)VARIANCE (expr)
S Y N T A XS Y N T A X
SELECT count(*) FROM stock;SELECT sum(total_price) FROM stock;SELECT city,state,count(*) FROM customer GROUP BY city,state;SELECT order_num,sum(total_price) FROM items GROUP BY order_num;
74INFORMIX User Guide
Select 의 예 (7) – group by,having
SELECT . . .FROM . . .GROUP BY 컬럼HAVING 조건 ;
S Y N T A XS Y N T A X
SELECT order_num,sum(total_price)FROM itemsGROUP BY order_numHAVING COUNT(*) > 2;
기준 컬럼에 의해 만들어진 group 안에서 조건을 만족하는 그룹의 결과만을 가져온다 .
75INFORMIX User Guide
Select 의 예 (8) – HINT 의 사용
Optimizer Directive (HINT) 란 ? SQL 을 어떠한 방식으로 실행할 것인가를 결정하는 optimizer 에게 주는 지시자 . Index 의 사용 , join 방법 등을 지정할 수 있다 .
문법 그 줄의 끝까지가 DIRECTIVE 일때
“--+”로 시작 여러 줄 혹은 그 줄의 일부가 DIRECTIVE 일때
{+ }로 묶음
76INFORMIX User Guide
Select 의 예 (8-1) – access method
--+ INDEX ( {table|view|synonym|alias} index[,index] )
S Y N T A XS Y N T A X
SELECT --+ INDEX(e salary_indx) name, salary FROM emp e WHERE e.dno = 1 AND e.salary > 50000;
특정 테이블에 대해 인덱스를 사용하여 질의하도록 함 .
--+ AVOID_INDEX ( {table|view|synonym|alias} index[,index] )
S Y N T A XS Y N T A X
특정 테이블에 대해 인덱스를 사용하지 않도록 질의하도록 함 .
SELECT --+ AVOID_INDEX(e salary_indx) name, salary FROM emp e WHERE e.dno = 1 AND e.salary > 50000;
77INFORMIX User Guide
Select 의 예 (8-2) – access method
--+ FULL ( {table|view|synonym|alias} )
S Y N T A XS Y N T A X
SELECT {+ FULL(e) } name, salary FROM emp e WHERE e.dno = 1 AND e.salary > 50000;
특정 테이블에 대해 full scan 하여 질의하도록 함 .
--+ AVOID_FULL ( {table|view|synonym|alias} )
S Y N T A XS Y N T A X
특정 테이블에 대해 full scan 하지 말고 질의하도록 함 .
SELECT {+ AVOID_FULL(e), INDEX(e salary_indx) } name, salary FROM emp e WHERE e.dno = 1AND e.salary > 50000;
78INFORMIX User Guide
Select 의 예 (8-3) – Join Order
--+ ORDERED
S Y N T A XS Y N T A X
SELECT --+ ORDERED name, title, dept FROM dept, job, emp WHERE title = “clerk” AND emp.dno = dept.dno AND emp.job = job.job;
Join 의 대상 테이블에 대한 Join 의 순서를 from절 다음의 테이블 순서대로 하도록 한다 .
79INFORMIX User Guide
Select 의 예 (8-4) – Join Method
--+ USE_NL( {table|view|synonym|alias} )
S Y N T A XS Y N T A X
Join 에 있어서 Nested Loop Join 방법을 사용한다 .
--+ AVOID_NL( {table|view|synonym|alias} )
S Y N T A XS Y N T A X
Join 에 있어서 Nested Loop Join 을 사용하지 않는다 .
--+ USE_HASH( {table|view|synonym|alias} [/BUILD|/PROBE] )
S Y N T A XS Y N T A X
--+ AVOID_HASH( {table|view|synonym|alias} [/BUILD|/PROBE] )
S Y N T A XS Y N T A X
Join 에 있어서 HASH Join 방법을 사용한다 . Join 에 있어서 HASH Join 방법을 사용하지 않는다 .
80INFORMIX User Guide
Select 의 예 (8-2) – Optimization Goal
--+ FIRST_ROWS--+ ALL_ROWS (default)
S Y N T A XS Y N T A X
Query Optimizer 가 질의를 최적화 할때에 , 그 목적을 처음 몇개의 row 를 빨리 가져올 수 있도록 최적화 하거나 , 전체 row 를 빨리 가져올 수 있도록 최적화 할 것인가를 지정할 수 있다 .
이 방법은 질의의 대상이 전체가 아닌 일부분의 데이터 만을 가져오는 “ first n” 과 함께 사용될때 가장 좋은 성능을 낼 수 있다 ,
SELECT --+ FIRST_ROWS name, age FROM employee e, department d WHERE e.dept_no = d.dept_no;
SET OPTIMIZATION FIRST_ROWS;SELECT ……
OPT_GOAL. 파라매터를 사용하여 최적화 방법을결정할 수 있다OPT_GOAL = -1 : ALL_ROWSOPT_GOAL = 0 : FIRST_ROWS
81INFORMIX User Guide
Select 의 예 (8-2) – First N
SELECT FIRST n
S Y N T A XS Y N T A X
SELECT FIRST 10 name, salary FROM emp ORDER BY salary DESC;
질의의 결과중 처음 n 개의 row 를 가져옴 .
82INFORMIX User Guide
SQL 실행 경로 확인
SQL 구문이 optimizing 된 결과를 볼 수 있다 . Set explain on; 확인하고자 하는 구문들 . . . Set explain off;
UNIX 의 경우 현재 이 구문을 실행한 application 이 실행된 디렉토리 밑에 “sqexplain.out” 이라는 file 에 기록된다 .
NT 의 경우 $INFORMIXDIR/sqexpln 디렉토리 안에 현재 구문을 실행한 “user 이름 .out” 이라는 file 에 기록된다 .
예 >QUERY:------select * from customer
Estimated Cost: 1Estimated # of Rows Returned: 28 1) anchoi.customer: SEQUENTIAL SCAN
83INFORMIX User Guide
INSERT,UPDATE,DELETE
문법 Insert into 테이블 (컬럼이름들 ) values( 값들 );
테이블에 값들을 입력
Update 테이블 set 컬럼 ( 들 ) = 값 where 조건 ; 테이블중 조건에 만족하는 row 의 컬럼을 값으로 갱신
Delete 테이블 Where 조건 ; 테이블에 조건을 만족하는 row 를 삭제
84INFORMIX User Guide
Concurrency Control
DB 는 다수의 사용자에 의해 공유됨 . Read Concurrency - SELECT
4 가지의 isolation level 로 적용 . Dirty Read Committed Read Cursor Stability Repeatable Read
Update Concurrency - INSERT, DELETE, UPDATE Lock 의 크기로 적용
Type of Locking Exclusive Shared Update
Levels of locking Database, Table, Page, Row, Key
85INFORMIX User Guide
Concurrency Control - READ
Dirty Read
기존의 lock 을 check 하지 않고 , Data 를 읽어내림 .이때에 자신도 lock 을 걸지 않고 읽음 .
server processCommitted Read
자신이 lock 을 걸수 있는지 check 하고 읽어내림 .그러나 자신은 lock 을 걸지 않음 .
server process
Can lock be acquired?
Cursor Stability
Cursor 가 현재 fetch 하고 있는 row 에 대해Lock 을 걸고 , 다음 row 를 fetch 할때에 Lock 을 해제함 .
server processRepeatable Read
자신의 process 가 질의에서 참조하고 있는 모든 row 에 대해 lock 을 걸고 작업함 .
server process
Locks put onall rows examined
Shared lockplaced on row
86INFORMIX User Guide
Concurrency Control - READ
Isolation level 의 적용 DB 의 형태 별 default 가 존재 한다 .
NO Logging DB : Dirty Read Logging DB : Committed Read ANSI DB : Repeatable Read
따라서 default 이외로 변경시에는 다음의 구문으로 적용하여야 한다 . 해당 세션에만 적용된다 .
구문Set Isolation To Dirty Read;Set Isolation To Committed Read;Set Isolation To Cursor Stability;Set Isolation To Repeatable Read;
87INFORMIX User Guide
Concurrency Control - UPDATE
Database Level Locking
database stores exclusive;
stores
Table Level Locking
lock table customer in share mode;
customer
lock table customer in exclusive mode;
customer
update deleteinsert
select select
set isolationto dirty read
다른 사용자는 데이터베이스에 접근할 수 없다
88INFORMIX User Guide
Concurrency Control - Lock Mode
다른 사용자에 의해 lock 이 걸려 있는 자료에 접근할때에는 default 로 기다리지 않고 error 를 return.Set Lock Mode to Wait ;Set Lock Mode to Not Wait ;Set Lock Mode to Wait 20 ;
set lock mode to wait 20
set lock mode to not waitset lock mode to wait
lock 이 해제될때까지무한정 기다림
lock 이 해제될때까지 20 초 동안 기다림
lock 이 해제될때까지 기다리지 않고 즉시 에러를 리턴함
89INFORMIX User Guide
Concurrency Control - Page/Row
테이블 생성 시 default lock mode 는 page 단위create table row_lock_table (
id char(20),name char(20)
) lock mode row;alter table page_lock_table lock mode (page);page
page
modify
access
modify
90INFORMIX User Guide
SPL
Stored Procedure Language Stored procedure 를 작성하는 데 사용됨 . Stored procedure
DB 내에 저장된 SQL 문들과 , SPL 로 작성된 구문의 묶음 . 주로 business logic 을 DB 에 저장하는 용도로 사용됨 . SQL 문은 미리 parsing 되고 optimize 된 상태로 해당 DB 의 시스템 카타로그 테이블 (sysprocedures, sysprocbody, sysprocplan, sysprocauth) 에 저장됨 .
91INFORMIX User Guide
SPL - 간단한 예제
작성
create procedure test_proc(name varchar(10))insert into test_tab values(name);
end procedure;
실행execute procedure test_proc(“anna”);
Stored procedure 의 이름 매개 변수의 이름
매개 변수로 넘어 온 값을 test_tab 이라는 table 에 insert 하라는 구문
매개 변수의 type
92INFORMIX User Guide
SPL - 코드 내용 보기
DBSCHEMA utilitydbschema -d <dbname> -f <procedure 이름 > sql.sqldbschema -d <dbname> -f all spl.sql
System Catalog Tableselect data from sysprocedures d, sysprocbody b where datakey = “T” and d.procname = “procedure 이름” and d.procid = b.procid
93INFORMIX User Guide
SPL 생성 및 실행 - 기본구조
기본구조
create procedure raise_prices (per_cent int)update stock -- increase by percentage set unit_price = unit_price + (unit_price * (per_cent / 100 ) );
end proceduredocument “usage : execute procedure raise_prices (xxx) “, “xxx = percentage from 1 – 100 “
with listing in “warn_file”;
execute procedure raise_prices (5);execute procedure db@servername:raise_prices(5)
Stored procedure 의 이름 매개변수 문장 블럭 (statement block)
주석 (comment)
document 절은 생략 가능
컴파일 warning 저장
94INFORMIX User Guide
SPL 생성 및 실행 - 매개변수와 리턴값
create procedure delete_order (p_order_num int default null )returning int, int;define item_count int;select count(*) into item_count from items
where order_num=p_order_num;delete from items where order_num = p_order_num;delete from orders where order_num = p_order_num;returning p_order_num, item_count;
end procedure; DBACCESS
execute procedure delete_order (1001) ; ESQL/C
EXEC SQL execute procedure delete_order(:p_order_num) into :p_order_num, :p_item_count;
default 값
매개변수
두 개의 정수 반환 예정
두 개의 정수 변수 반환
95INFORMIX User Guide
SPL 생성 및 실행 - 커서사용
SPLcreate procedure get_items()
returning integer, char(3), integer;define p_stock_no integer;define p_manu_code char(3);define p_quantity integer;foreach
select stock_num, manu_code, quantityinto p_stock_no, p_manu_code, p_quantityfrom itemsreturn p_stock_no, p_manu_code, p_quantity with resume;
end foreach;end procedure;
EXEC SQL declare geti cursor for execute procedure get_items();EXEC SQL open getiwhile(1) { EXEC SQL fetch geti into :p_num, :p_code, :p_qty; if (sqlca.sqlcode == 100) break;}EXEC SQL close geti;
EXEC SQL declare geti cursor for execute procedure get_items();EXEC SQL open getiwhile(1) { EXEC SQL fetch geti into :p_num, :p_code, :p_qty; if (sqlca.sqlcode == 100) break;}EXEC SQL close geti;
ESQL/CESQL/CESQL/CESQL/C
foreach 문안에서 계속 리턴값을 반환하도록 한다
커서 사용
96INFORMIX User Guide
SPL 생성 및 실행 - 호출 / 제거
SQL 문에서 호출select * from orders where order_num = get_biggest_order(114);insert into old_orders execute procedure get_orders(114);
SPL 에서 호출create procedure give_disconnect (p_customer_num integer)
define p_order_num integer;call get_biggest_order (p_customer_num ) returning p_order_num;:
end procedure SPL 제거
drop procedure get_biggest_order;
97INFORMIX User Guide
SPL 구문 - 변수
SPL 내부에서 변수 선언 define p_order_date date; define p_customer_num like orders.customer_num; define global global_bar integer default 1; define blob_var references text;
변수값 할당 let c = 10; let d = 5; let p_order_date = today; let a,b = 10,c+d; let a,b = (select col_a, col_b from tab1 where col_c=10); let a = proc_name(); let a = c || d;
유효한 데이터베이스 자료형
명시한 테이블 컬럼의 자료형
세션 안에서 전역값을 가진다 BLOB 자료형
98INFORMIX User Guide
SPL 구문 - 조건식
구문IF 조건식 THEN 문장 1 ELIF 조건식 THEN 문장 2 ELSE 문장 3END IF
조건식의 예if exists (select order_num from orders where order_num = 1023)
then:
end ifif p_total_price > all (select total_price from items where order_num = 1023) then
:
end ifif p_customer_name matches “A*” then
:
end if
99INFORMIX User Guide
SPL 구문 - 루프
FOREACHforeach select ship_charge into p_ship_charge from orders
:
end foreach; WHILE
while i < nbr_rowsinsert into test_tab values ( i );let i = i + 1;
end while FOR
for i = 1 to 10 step 2:
end forfor i in (1,5,10,15) … end forfor i in (1 to 20 step 5, 20 to 1 step –5, 1,2,3,4,5) … end for
※ 루프 제어for i = 1 to 10 if i = 5 then continue for; elif i = 8 then exit for; end ifend for;
※ 루프 제어for i = 1 to 10 if i = 5 then continue for; elif i = 8 then exit for; end ifend for;
100INFORMIX User Guide
SPL 구문 – dbinfo 사용
serial 값 반환define ser int;insert into orders (order_num, order_date, customer_num) values (0, “04/01/99”, 102);let ser = dbinfo(“sqlca.sqlerrd1”);
처리된 행의 수 반환define num_rows int;delete from orders where customer_num = 104;let num_rows = dbinfo(“sqlca.sqlerrd2”);
101INFORMIX User Guide
SPL 구문 - 기타
업데이트 커서define p_ship_date date;begin work;foreach cur1 for
select ship_date into p_ship_date from orders where order_date < today - 100if p_ship_date is not null then delete from orders where current of cur1;end if
end foreach;commit work;
OS 명령어 호출system “echo ““Delete Operation Completed”” | mail judy” ;system “mail –s violation ” || usr1 || “ ” || usr2 || “< vio.file”;
업데이트 커서의 이름을 명시해야 한다
현재 커서가 오픈하고 있는 행
업데이트 된 행의 lock 해제
102INFORMIX User Guide
Trigger
트리거 (Trigger) 는 어떠한 이벤트가 발생했을때 자동적으로 SQL 문을 실행하도록 하는 데이터베이스 메커니즘
트리거 이벤트 (event) 는 특정 테이블에 대해 INSERT, UPDATE, DELETE 와 같은 SQL 문
트리거 액션 (action) 은 INSERT, UPDATE, DELETE 및 EXECUTE PROCEDURE 문
Trigger
CreateTrigger
Triggername
Triggerevent
Triggeraction
correlationname
103INFORMIX User Guide
Trigger - Event / Action
트리거 이벤트 (event) INSERT ON 테이블이름 DELETE ON 테이블이름 UPDATE ON 테이블이름 UPDATE OF 컬럼이름 ON 테이블이름
트리거 액션 (action) BEFORE ( SQL 문 ) FOR EACH ROW ( SQL 문 ) AFTER ( SQL 문 )
예제create trigger test1 update on orders
before (execute procedure check_permission())for each row (execute procedure log_chg())after (execute procedure log_total());
106
106
update orders set ship_instruct = “express”where customer_num = 106;
update orders set ship_instruct = “express”where customer_num = 106;
event
execute check_permissionupdate 1 rowexecute log_chgupdate 1 rowexecute log_chgexecute log_total
execute check_permissionupdate 1 rowexecute log_chgupdate 1 rowexecute log_chgexecute log_total
action
104INFORMIX User Guide
Trigger - referencing
트리거 동작 전 ,후의 값을 구분하기 위하여 correlation name 을 부여 NEW, OLD 는 키워드로 DELETE 이벤트에서는 NEW 가 사용 될 수 없고 ,
INSERT 이벤트에서는 OLD 가 사용 될 수 없다 . 예제
create trigger items_upd update of total_price on itemsreferencing new as post old as prefor each row
(update orders set order_price = order_price + post.total_price = pre.total_price
where order_num = post.order_num );
105INFORMIX User Guide
Trigger - when
트리거 이벤트가 발생되었을때 WHEN절에 조건이 만족하는지 먼저 검사한 후 조건이 맞을 때에 트리거 액션이 동작한다 .
예제create trigger ins_cust_calls insert on cust_calls
referencing new as postfor each row when (post.call_code = “B”)
( insert into warn_billing values (post.customer_num) );
DB admin 작업 DB admin 작업이란 DB 의 생성 Table 의 생성 Table 의 분할 보안의 설정 데이터 무결성 보장 인덱스의 생성 질의 수행을 최적화 해주기 위한 작업 Data Migration
107INFORMIX User Guide
DB admin 작업이란
DB admin 작업이란 ? DB 와 관련된 사항을 결정하고 , 변경하는 작업 DB 나 table 을 생성하는 작업 보안을 적용하는 작업 데이터의 무결성을 보장하는 작업 동시 사용자에 관한 제어 인덱스와 관련된 작업 질의 수행을 최적화해 주는 작업 Data migration
108INFORMIX User Guide
DB 의 생성
DB 의 생성시 다음의 사항을 고려해야 한다 . DB 를 물리적으로 어느 위치에 둘 것인가
DB 가 위치할 dbspace 를 지정함 . DB 는 어떤 형태로 만들것인가
DB 에 대한 logging 작업을 할 것인가를 결정
create database <DB 이름 > in <DB 를 저장할 dbspace 이름 > default: rootdbswith <DB 의 logging 모드 >; default : no logging
예 > create database test_db in dbspace1 with log;create database test_db with log;create database test_db in dbspace1 ;create database test_db in dbspace1 with buffered log;
109INFORMIX User Guide
Table 의 생성
Table 생성시 다음의 사항을 고려해야 한다 . 컬럼에는 어떤 자료형을 사용할 것인가 테이블에 대해 분할 할 것인가 테이블의 위치 얼마만큼의 디스크 공간을 할당할 것인가 테이블에 대한 lock 모드
create table <테이블이름 >( 컬럼이름 컬럼자료형 )in <dbspace 이름 > or < 분할 방법및 위치 >extent size <초기에 할당할 영역 크기 K 단위 : default 는 8page>next size <증가분에 할당할 영역 크기 K 단위 : default 는 8page>lock mode <row or page : default 는 page>;
110INFORMIX User Guide
Table 의 분할
한 테이블의 데이터를 여러 dbspace 에 분할한다 병렬적으로 데이터를 입출력 할 수 있다 입출력의 부하를 균등하게 조절할 수 있다 데이터의 가용성을 향상 시킨다 다양한 기준으로 데이터를 분할할 수 있다
fragment1
fragment2
fragment3
scan thread
scan thread
scan thread
table
병렬
스캔
입출력 부하 분산
111INFORMIX User Guide
Table 의 분할 - round robin
create table roundtable (col_1 serial,col_2 char(20),:
) fragment by round robin in dbspace1, dbspace2, dbspace3extent size 10000 next size 3000 ;
dbspace1 dbspace2 dbspace3
insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);insert into roundtable(col_1, col_2) values (0, ‘aabb’);
112INFORMIX User Guide
Table 의 분할 - Expression
create table exprtable (col_1 serial,col_2 char(20),:
) fragment by expression
col_1 <= 100 and col_1 >= 1 in dbspace1,col_1 <= 200 and col_1 > 100 in dbspace2,remainder in dbspace3 ;
dbspace1 dbspace2 dbspace3
insert into exprtable(col_1) values (50);insert into exprtable(col_1) values (700);insert into exprtable(col_1) values (120);
113INFORMIX User Guide
Table 의 분할 - hash
create table exprtable (col_1 serial,col_2 char(20),:
) fragment by expression
mod (col_1, 3) = 0 in dbspace1,mod (col_1, 3) = 1 in dbspace2,mod (col_1, 3) = 2 in dbspace3 ;
dbspace1 dbspace2 dbspace3
insert into exprtable(col_1) values (17);insert into exprtable(col_1) values (34);insert into exprtable(col_1) values (66);
114INFORMIX User Guide
Table 의 분할 - guidelines
가급적 remainder 절을 쓰지 않도록 expression 을 만든다 여러 디스크에 I/O 를 분산할 수 있도록 고려한다 expression 은 가능한한 단순한 형태여야 한다 expression 에서 가장 제한적인 조건이 먼저 나올 수 있도록 한다 데이터의 변환이 필요한 expression 은 피한다 데이터 로드 및 전체 조회가 주된 목적이라면 round robin 을 사용한다 인덱스 또한 fragment 구문에 의해 분할 될 수 있지만 , 가급적 별도의
dbspace 에 fragment 되지 않은 형태 (detached index) 로 생성한다create index idx_roundtable on roundtable(col_1) in dbspace4;
테이블 분할에 의한 이득이 그다지 많지 않다면 분할하지 않는다
115INFORMIX User Guide
보안의 설정
보안의 적용 방법 권한 제한 View 의 사용 Role 의 사용
권한의 종류 DB level : DBA,RESOURCE,CONNECT Table,Column level : SELECT,INSERT,UPDATE,DELETE,ALTER…
116INFORMIX User Guide
보안의 설정 - 권한 제한
권한 설정 방법 GRANT 권한이름 <on 테이블이름 (컬럼이름 )> to user 이름 ; REVOKE 권한이름 <on 테이블이름 > from user 이름 ; Table 의 경우 일단 모든 권한을 뺏고 하나하나 설정한다 .
예GRANT DBA to user1;GRANT CONNECT to user2;REVOKE ALL ON tab1 from PUBLIC;GRANT SELECT ON tab1 to user2;GRANT DELETE,UPDATE,INSERT on tab1 to user1;GRANT SELECT(col1,col2) on tab2 to user2;
117INFORMIX User Guide
보안의 설정 - view 의 사용
View 는 테이블의 일부 혹은 계산된 값등에 설정될 수 있다 . 예
create view cust_seoul asselect * from customer where city=‘ 서울’ ;
create view big_order_won asselect total_price*1200 from orders where total_price > 10000;
create view detail_info_cust asselect company, order_num,total_price from customer,orders where customer.customer_num=orders.customer_num;
118INFORMIX User Guide
보안의 설정 - role 의 사용
Role 이란 , 사용자의 그룹 권한의 제한이 , 개인별로가 아닌 그룹별로 해야할 필요가 있을때에 쓰임 .
개인은 개인의 권한으로의 작업도 가능하고 , role 의 일원으로서의 작업도 가능하다
예Create role marketing;Create role sales;Grant marketing to user1,user2;Grant sales to user3,user4;
만일 user1 이 marketing role 로서 작업하려면 다음 구문을 실행해야 함 .Set role marketing;
119INFORMIX User Guide
데이터 무결성의 보장 (1)
데이터값에 대한 속성을 제한자 (constraint) 를 통해 적용 . 종류
Primary Key Foreign key CHECK UNIQUE NOT NULL
120INFORMIX User Guide
데이터 무결성의 보장 (2)
Constraint 의 이름은 자동적으로 부여 될 수 있지만 , 직접 명시할 수도 있다CREATE TABLE orders (
order_num integer UNIQUE CONSTRAINT order_num_uq,order_date date NOT NULL CONSTRAINT order_num_nn DEFAULT TODAY);
ALTER TABLE orders MODIFY order_num integer NOT NULL CONSTRAINT order_num_nn;
Constraint 는 컬럼 단위 또는 테이블 단위로 정의할 수 있는데 , 다른 컬럼에 대한 정의가 포함될 경우는 테이블 단위로 정의해야만 한다
-- 테이블 단위ALTER TABLE items ADD CONSTRAINT CHECK (quantity >= 1);-- 컬럼 단위ALTER TABLE items MODIFY quantity smallint CHECK (quantity >= 1);-- 컬럼 단위는 다른 컬럼을 사용할 수 없다 .ALTER TABLE orders MODIFY paid_date date CHECK (paid_date >
ship_date);##676: Invalid check constraint column.
121INFORMIX User Guide
데이터 무결성의 보장 (3)
Referential Constraint 의 종류 Cyclic referential constraints
Self referential constraints
Multiple path constraints
Primary / Foreign Key 규칙 Primary key 는 자동적으로 unique index 역할을 하게 된다 Foreign key 컬럼값은 Primary key 에 값이 있어야 입력 , 수정 할 수 있다 Foreign Key 값이 있는 상태에서 Primary Key 값을 삭제 , 수정 할 수 없다
parent parent child child
parent parent
parent parent child child
child child
122INFORMIX User Guide
데이터 무결성의 보장 (4)
Cyclic referential constraintscreate table customer (
customer_num serial,fname char(20),primary key (customer_num) constraint pk_cnum );
create table orders (order_num serial,customer_num integer,foreign key (customer_num) references customer constraint fk_cnum);
Self referential constrainscreate table emp (
enum serial,mnum integer,primary key (enum) constraint pk_enum,foreign key (mnum) references emp(enum) constraint fk_enum) ;
customer_num
fname
customercustomerorder_num
ordersorders
customer_num
enum
mnum
empemp
123INFORMIX User Guide
데이터 무결성의 보장 (5)
Multiple path referential constraintscreate table stock (
stock_num smallint,manu_code char(3),primary key (stock_num, manu_code) constraint pk_stock);
create table items (item_num smallint,stock_num smallint,manu_code char(3),foreign key (stock_num, manu_code) references stock constraints fk1_stock);
create table catalog (catalog_num serial,stock_num smallint,manu_code char(3),foreign key (stock_num, manu_code) references stock constraints fk2_stock);
stock_num
stockstock
item_num
itemsitems
stock_num
manu_code
manu_code
catalog_num
catalogcatalog
stock_num
manu_code
124INFORMIX User Guide
인덱스의 생성
테이블에 대해 빠른 접근을 위해 사용 OLTP 업무의 경우 인덱스의 생성은 매우 중요함 . 다음에 해당되는 컬럼에 생성하는 것이 좋음 .
조인의 대상이 되는 컬럼 조건 비교의 대상이 되는 컬럼 정렬의 기준이 되는 컬럼
Create index < 인덱스이름 > on 테이블이름 (컬럼이름 ) In < 인덱스를 저장할 위치 >;
예create unique index idx_cust on customer(customer_num) in dbspace1;create index idx_stock on stock (stock_num, manu_code) ;
125INFORMIX User Guide
질의 수행을 최적화 해주기 위한 작업
서버로 전달된 모든 질의는 다음의 과정을 거침
질의 수행 경로를 결정하는데 참조하는 데이터는 system catalog 의 정보를 기반으로 함 .
질의 수행 경로를 결정하는 데 영향을 미치는 요인 인덱스 유무 , 데이터의 양 , 데이터 분포도 등 ..
따라서 , 현재상황의 데이터에 관한 정확한 정보를 제공하여야 , 최적의 질의를 수행할 수 있음 .
ParsingParsing OptimizingOptimizing ExecutingExecuting
유효성 , 문법 등을 체크 최적화된 질의 수행의경로를 결정
실행
126INFORMIX User Guide
질의 수행을 최적화 해주기 위한 작업
Update statistics System catalog 의 데이터 관련 통계자료를 갱신 데이터에 대한 분포도를 만들어줌 .
Mode 의 종류 Low
system catalog 의 통계정보만 갱신 Medium
통계정보 갱신과 함께 , 데이터 분포도를 만듬 . 이때 , 표본 추출에 의해 분포도를 만듬 . High
medium 과 같으나 , 표본추출이 아닌 전체 데이터를 가지고 분포도를 만듬 .
127INFORMIX User Guide
질의 수행을 최적화 해주기 위한 작업
언제 수행하여야 하나 ? 대량의 데이터 변경시에는 반드시 해주어야 한다 .
Bulk Data loading후 , bulk update등 .. 시스템 유휴 시간대에 정기적으로 해주어도 좋다 .
구문 Update statistics [low|medium|high] ; Update statistics [low|medium|high] for table; Update statistics [low|medium|high] for table 테이블이름 ; Update statistics [low|medium|high] for table 테이블이름 (컬럼이름 );
128INFORMIX User Guide
Data Migration
DB 혹은 table 을 file 로 내릴 필요가 있을때 사용 . Data Backup 의 하나의 방법으로도 사용 가능 서로 다른 기종의 machine 에 있는 서버로 데이터를 옮기고자 할때 유용 . Data 를 기존의 table 에 append 할때에 유용 . 사용 용도나 , 제공되는 기능에 따라 다양한 tool, 구문을 제공 .
129INFORMIX User Guide
Data Migration - Unloading
종류 UNLOAD 구문
SQL 구문이므로 사용하기 쉽고 , 원하는 조건에 따라 내려 받을 수 있다 . UNLOAD to ‘ 파일이름’ select * from customer;
ONUNLOAD DB담위 , table 단위 가능 Binary 형태로 받음 .
onunload –t /dev/rmt0 DB 이름
DBEXPORT DB 단위의 작업 지원 : DB 단위작업에 가장 많이 사용 Ascii 형태로 받음 .
dbexport DB 이름
ONPLOAD HPL(High Performance Loader) 을 구성하는 process 많은 양의 데이터에 대해 가장 좋은 성능을 냄 .
130INFORMIX User Guide
Data Migration - Loading
종류 LOAD 구문
SQL 구문이므로 사용하기 쉽고 , 원하는 조건에 따라 내려 받을 수 있다 . LOAD from ‘ 파일이름’ insert into customer;
ONLOAD DB담위 , table 단위 가능 Binary 형태로 받음 .
onload –t /dev/rmt0 DB 이름
DBIMPORT DB 단위의 작업 지원 : DB 단위작업에 가장 많이 사용 Ascii 형태로 받음 .
dbimport DB 이름
ONPLOAD HPL(High Performance Loader) 을 구성하는 process 많은 양의 데이터에 대해 가장 좋은 성능을 냄 .
ESQL/C 를 이용한 프로그래밍 ESQL/C 란 ESQL/C 의 사용 ESQL/C 프로그램 작성 규칙 ESQL/C 프로그램 compile ESQL/C 프로그램 작성 예제 호스트변수 (Host Variables) 데이터베이스 연결 SQLCA 구조체 EXCEPTION 테스트 GET DIAGNOSTICS 사용 prepare 를 사용한 단순 DML 처리 Indicator 사용 커서 (Cursors)
132INFORMIX User Guide
ESQL/C 란
C 프로그램 내에 sql 구문을 바로 넣어 그 실행 결과를 프로그램에서 다양하게 사용할 수 있도록 제공되는 어플리케이션 개발 tool
ESQL/C 의 주된 component 는 preprocessor 로서 ESQL/C code 를 C code 로 변환하여 C compiler 에게 넘겨준다 .
133INFORMIX User Guide
ESQL/C 의 사용
다음의 환경변수를 설정해야 한다 . INFORMIXDIR
ESQL/C 설치 디렉토리 PATH
ESQL/C 실행 파일의 위치를 추가 LD_LIBRARY_PATH
Library 의 위치 INFORMIXC
CC 컴파일러 외의 다른 컴파일러를 사용하고자 할 때
예export INFORMIXDIR=/usr/informixexport PATH=$PATH:$INFORMIXDIR/binexport LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/esqlexport INFORMIXC=gcc
134INFORMIX User Guide
ESQL/C 프로그램 작성 규칙
ESQL/C preprocessor 가 다른 C code 와 구별할 수 있게 하기 위해 SQL은 “ $” 혹은 “ exec sql” 으로 시작
SQL 구문의 끝에는 “ ;”를 붙임 . SQL 구문 안의 변수 (host 변수라 부름 ) 는 변수 이름 앞에 “ :”를 붙임 . 주석은 표준 C 의 주석인 “ /* */”사용
135INFORMIX User Guide
ESQL/C 프로그램 compile (1)
Esql 의 option 은 다양하므로 각 경우에 따라 다양하게 사용 esql [-e] [preprocessor 옵션 ] [cc 매개변수 ] [-o 실행파일 ] 소스 .ec [
링크옵션 ] 예 >
ESQL/C 로 작성된 customer.ec file 을 customer 라는 이름의 실행파일로 만들고자 한다면
esql -o customer customer.ec
esql customer.ec file.c -l mylib -o customer -static
customercustomercustomer.eccustomer.ec customer. ccustomer. c customer. ocustomer. o
esql preprocess c compile
standard librarystandard library esql/c libraryesql/c library
customercustomercustomer.eccustomer.ec customer. ccustomer. c customer. ocustomer. o
esql preprocess c compile
file. ofile. ofile.cfile.c mylibmylib
-static 옵션
-shared 옵션이 default 값
136INFORMIX User Guide
ESQL/C 프로그램 compile (2)
include 에 지정된 파일을 찾는 순서 현재 디렉토리 컴파일시 -I 옵션으로 지정한 디렉토리 $INFORMIXDIR/incl/esql /usr/include
다음과 같은 preprocessor 구문을 사용할 수 있다 define, undef ifdef, elseif, else, endif, ifndef 예제
EXEC SQL define USERTRANSACTIONS;EXEC SQL ifdef USERTRANSACTIONS;EXEC SQL begin work;EXEC SQL endif;
# include <stdio.h>EXEC SQL include pgm_global.h;EXEC SQL “filename” main (){ …}
# include <stdio.h>EXEC SQL include pgm_global.h;EXEC SQL “filename” main (){ …}
myfile.ecmyfile.ec
EXEC SQL include sqlca;EXEC SQL begin declare section;int customer_num;long drop_date;EXEC SQL end declare section;
EXEC SQL include sqlca;EXEC SQL begin declare section;int customer_num;long drop_date;EXEC SQL end declare section;
pgm_global.hpgm_global.h
137INFORMIX User Guide
ESQL/C 프로그램 작성 예제
#include <stdio.h>exec sql include sqlca;main(int argc,char **argv){
exec sql begin declare section;char dbname[19];exec sql end declare section;printf(“Enter name of database : “);gets(dbname);exec sql database :dbname;if (SQLCODE == 0)
printf(“Database %s is now open.\n”,dbname);else
printf(“Error %ld opening database\n”,SQLCODE);exit(0);
}
138INFORMIX User Guide
호스트변수 (Host Variables) (1)
호스트 변수 : SQL 데이터를 저장하는 C 변수 대소문자 구분 SQL 문장안에서 컬럼명과 구분하기 위하여 호스트변수 앞에 : 기호 사용 선언
달러 기호 사용$ CHAR *desc;
EXEC SQL 키워드 사용EXEC SQL begin declare section;char *desc;EXEC SQL end declare section;
사용 SQL 문 내에서
EXEC SQL update customer set zipcode = :zipcode ; C 구문 안에서
gets (dbname);EXEC SQL database :dbname;
139INFORMIX User Guide
호스트변수 (Host Variables) (2)
C 의 변수 선언과 유사 사용자 정의
typedef short smallint;typedef long date;smallint stocknum;date orderdate;
구조체struct stock_t {
short stocknum;char manucode[4];
} stockrec1;struct stock_t stockrec2;
배열char *buf[6];static long unit[6] = {0,0,0,0,0,0}
simple types
SQL C
char(n) character(n) smallint integer int smallfloat real float double precision serial date
char [ n + 1 ]char *short int long int
float
double
long int long int
decimal dec numeric money datetime interval varchar
dec_t or struct decimal
dtime_t or struct dtime intrvl_t or sturct intrvl varchar or string
non-simple types
140INFORMIX User Guide
호스트변수 (Host Variables) (3)
external 이나 static 으로 선언하지 않은 경우 자동적으로 local 범위
function parameter 로 사용될 때의 예제 선언
EXEC SQL begin declare section;char *col;EXEC SQL end declare section;
함수int foo (col)EXEC SQL begin declare section;parameter char *col;EXEC SQL end declare section;{ :}
$ extern short StockNumS ;
func1() $ double StockNumS ;
$ {$ long StockNumS ; :$ }
func2() {$ insert into stock … values ($StockNumS); :}
141INFORMIX User Guide
데이터베이스 연결 (1)
ESQL/C 6.0 이전의 구문 ( 현재 버전에서도 사용가능하지만 , 권장 사항 아님 ) DATABASE 데이터베이스명 CLOSE DATABASE
ESQL/C 6.0 이후 구문 CONNECT TO 데이터베이스명 DISCONNECT ALL
CONNECT 구문의 옵션 Connection 이름
EXEC SQL CONNECT TO ‘stores@munish’ AS ‘munich_con’ ; User 절
EXEC SQL CONNECT TO ‘stores@munish’ USER :uid USING :passwd ; Default 절 ( 데이터베이스를 오픈하지 않고 서버에 연결 )
EXEC SQL CONNECT TO DEFAULT ; Default절 사용 후 다음과 같은 문장이 필요
DATABASE CREATE DATABASE START DATABASE
142INFORMIX User Guide
데이터베이스 연결 (2)
연결 전환 (switching) 구문
EXEC SQL SET CONNECTION ‘munish_con’ ;EXEC SQL SET CONNECTION :connect_id ;EXEC SQL SET CONNECTION DEFAULT;
connection 이름을 가지고 연결해야 switch 할 때 사용할 수 있다 connection 이 전환될 때 기존의 모든 트랜잭션은 먼저 commit 된다 현재 트랜잭션을 유지한 상태에서 connection 을 전환하려면 WITH
CONCURRENT TRANSACTION 구문을 사용하여 먼저 연결하여야 한다 .EXEC SQL CONNECT TO :db_connect AS :connect_id WITH CONCURRENT
TRANSACTION
연결 종료 (disconnecting) 열린 데이터베이스를 닫고 connection 을 종료한다
EXEC SQL DISCONNECT :connect_id ;EXEC SQL DISCONNECT CURRENT ;EXEC SQL DISCONNECT DEFAULT ; EXEC SQL DISCONNECT ALL ;
default 로 connect했거나 connection 이 하나 일 경우 DEFAULT 사용
143INFORMIX User Guide
SQLCA 구조체
SQL 문을 실행한 후 서버에서 SQLCA 라 불리는 영역에 feedback 정보를 남긴다 errors performance warnings
SQLCODE 는 sqlca.sqlcode 값과 같다 SQLCODE < 0 : 에러 코드 값 SQLCODE = 0 : 정상적 처리 SQLCODE = 100 : SQLNOTFOUND, 찾는 행이 없음 SQLCODE = 1~99 : Dynamic SQL
에러 메시지를 얻기 위한 함수 rgetmsg, rgetlmsg
char msg1[512], msg2[512];if (SQLCODE) /* SQL 에러 */
rgetmsg(SQLCODE, msg1, sizeof(msg1) );if (sqlca.sqlerrd[1]) /* ISAM 에러 */
rgetmsg( (short)sqlca.sqlerrd[1], msg2, sizeof(msg2) );printf (“%ld : %s \n %ld : %s\n”,SQLCODE, msg1, sqlca.sqlerrd[1], msg2);
struct sqlca_s { long sqlcode ; char sqlerrm[72] ; char sqlerrp[8] ; long sqlerrd[6] ; struct sqlcaw_s { char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; } sqlwarn ;} ;extern struct sqlca_s sqlca;
struct sqlca_s { long sqlcode ; char sqlerrm[72] ; char sqlerrp[8] ; long sqlerrd[6] ; struct sqlcaw_s { char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; char sqlwarn0 ; } sqlwarn ;} ;extern struct sqlca_s sqlca;
144INFORMIX User Guide
EXCEPTION 테스트
SQL 문이 실행되고 다음과 같은 4 가지 중 하나의 상태가 된다 성공 / 성공 , 찾을 수 있는 데이터는 없음 / 성공 , 경고 (warning) 메시지가 있음 실패
성공 외의 나머지 상태에 대한 처리 방법을 exception 처리로 제어한다 WHENEVER exception action
exception : NOT FOUND, SQLWARNING, SQLERROR action : GO TO label, CALL function, STOP, CONTINUE
디폴트 action 은 CONTINUE WHENEVER 문의 scope 는 한 소스 파일에서 global 성격을 가진다
Module 1stock_ins() { EXEC SQL whenver sqlerror call sqlerr; :}
stock_del() { EXEC SQL whenver sqlerror continue; :}
sqlerr() { :}
Module 2
stock_qry() { EXEC SQL whenver sqlerror goto doerr; : return ;doerr :}
145INFORMIX User Guide
GET DIAGNOSTICS 사용 (1)
GET DIAGNOSTICS 문은 여러개의 SQL exception 을 처리할 수 있고 , ANSI 및 X/OPEN 표준으로 컴파일된다
SQLCA 는 계속 사용가능하다 다음 세가지 분류로 사용한다
SQLSTATE GET DIAGNOSTICS 문 GET DIAGNOSTICS EXCEPTION 문
GET DIAGNOSTICS 의 정보 MORE : 모든 exception 이 반환되었음을 나타냄 NUMBER : exception 의 갯수 ROW_COUNT : SQL 에 의해 처리된 행 수
EXCEPTION 의 정보 RETURNED_SQLSTATE SERVER_NAME CONNECTION_NAME CLASS_ORIGIN 등
C C S S S
SQLSTATESQLSTATE
subclass codesubclass codeclass codeclass code
00 성공01 성공 ( 경고포함 ) 02 데이터없음>02, IX 에러발생
146INFORMIX User Guide
GET DIAGNOSTICS 사용 (2)
SQLSTATE 사용 예if (strncmp(SQLSTATE, “00”, 2) == 0 ) . . . /* 성공 */else if (strncmp(SQLSTATE, “01”, 2) == 0 ) . . . /* 성공 ( 경고 포함 ) */else if (strncmp(SQLSTATE, “02”, 2) == 0 ) . . . /* 데이터 없음 */else . . . /* 에러발생 */
DIAGNOSTICS 사용 예EXEC SQL BEGIN DECLARE SECTION;int xcept_cnt;char more_ind[2];EXEC SQL END DECLARE SECTION;EXEC SQL WHENEVER SQLERROR CALL get_errmsg;. . ./* ---- get_errmsg() ---- */EXEC SQL GET DIAGNOSTICS :more_ind = MORE, :xcept_cnt = NUMBER;if (strcmp(more_ind, “Y”) == 0 )
printf (“%ld Exceptions, more than fit in diagnostics area. \n”, xcept_cnt);
147INFORMIX User Guide
Prepare 를 사용한 단순 DML 처리
단일 SQL 문 처리 예EXEC SQL insert into customer (customer_num, fname, lname,
company) values (0, :fname, :lname, ‘MPS Corp’);EXEC SQL insert into items values (:itemsrec);※ itemsrec 변수는 items테이블의 컬럼 순서로 선언된 structure 형
PREPARE / EXECUTE 사용EXEC SQL PREPARE ins_p from “insert into customer (customer_num, fname, lname, company) values (0,?,?,?)” ;EXEC SQL EXECUTE ins_p using :fname, :lname, :company;
PREPARE 를 사용하는 이유 PREPARE 시점에 SQL 문장에 대하여 미리 parsing 되고 query plan 이
생성된다 EXECUTE 시점에는 처리해야 할 값만 넘겨주면 즉시 실행된다 하나의 DML 문장에서 여러번 값을 바꿔서 넘겨주어야 할 때 PREPARE 에서 한
번만 query plan 을 생성하므로 유용하게 사용할 수 있다
148INFORMIX User Guide
Indicator 사용
데이터를 호스트변수에 저장할 때 다음과 같은 Exception 이 발생할 수 있다 NULL 값을 fetch 하였다 컬럼 데이터에 비해 호스트 변수의 크기가 작다
사용법 :host 변수 :indicator 변수 $host 변수 $indicator 변수 :host 변수 INDICATOR indicator 변수 (ANSI 표준 )
예EXEC SQL begin declare section;char ship_instruct[16];short instruct_ind;EXEC SQL end declare section;EXEC SQL select ship_instruct into :ship_instruct indicator instruct_ind from orders where order_num = :ord_num;
NULL
NULL -1
ship_instruct ship_instruct instruct_ind instruct_ind
ring bell, kick 40
ship_instruct ship_instruct instruct_ind instruct_ind
ring bell, kick door loudly
ship_instruct char(40) ship_instruct char(40)
149INFORMIX User Guide
커서 (Cursor) (1)
Cursor 의 이해 Cursor 는 select 구문에 의해 선택된 row 들을 가리키고 있는 일종의 marker
라고 볼 수 있음 . 여러개의 row 를 가져오는 select 문의 결과에 대해 처리하기 위해서 필요함 . Cursor 의 종류
Insert cursor Select cursor
Scroll cursor Non-scroll cursor For update cursor
Previous
Next
Scroll cursorScroll cursor
Next
Non-Scroll cursorNon-Scroll cursor
Next
For Update cursorFor Update cursor
150INFORMIX User Guide
커서 (Cursor) (2)
Cursor 의 사용 순서 DECLARE
SELECT 구문에 대해 사용할 cursor 의 이름 할당 Application memory 에 cursor block setting
OPEN SELECT 구문의 문법을 체크하고 , 질의에 만족하는 row 들에 대해 논리적인 set 을
open Server memory 에 cursor block setting Application memory 에 data buffer setting
FETCH 실질적인 row 를 database 로 부터 가져옴 . fetch next, fetch prior, fetch relative n, fetch absolute n 등
CLOSE Cursor 의 사용종료를 의미 . 사용하던 temp table 삭제됨 . Cursor 에 할당된 buffer 반환 사용하던 lock 을 release
FREE Cursor 가 사용하던 application 과 server 측의 자원을 반환
151INFORMIX User Guide
커서 (Cursor) (3)
Scroll Cursor 사용의 예EXEC SQL DECLARE test_cur SCROLL CURSOR FOR select lname from
customer;EXEC SQL OPEN test_cur;
:
EXEC SQL FETCH NEXT test_cur INTO :host_var;:
EXEC SQL CLOSE test_cur;EXEC SQL FREE test_cur;
PREPARE 를 사용한 커서의 예EXEC SQL PREPARE p_id FROM “select customer_num form customer where lname = ?” ;strcpy(lname, “smith”);EXEC SQL DECLARE cur_c SCROLL CURSOR FOR p_id ;EXEC SQL OPEN cur_c USING :lname ;
152INFORMIX User Guide
커서 (Cursor) (4)
FOR UPDATE 커서의 예EXEC SQL DECLARE upd_cur FOR select unit, unit_descr from stock where stock_num=:stp->stock_num and manu_code=:stp-
>manu_code FOR UPDATE;
:
EXEC SQL OPEN upd_cur ;EXEC SQL FETCH upd_cur INTO :stp->unit, :stp->unit_descr;
:
EXEC SQL update stock set (unit, unit_descr) = (:stp->unit, :stp->unit_descr)
where current of upd_cur;:
EXEC SQL CLOSE upd_cur ;EXEC SQL FREE upd_cur ;
153INFORMIX User Guide
커서 (Cursor) (5)
INSERT 커서의 사용 단계 DECLARE : insert 문을 정의하고 커서명을 할당 OPEN : insert 문의 적합 여부를 체크하고 insert 버퍼를 할당한다 PUT : 입력할 데이터를 insert 버퍼에 넣는다 FLUSH : insert 버퍼의 내용을 데이터베이스로 저장한다 CLOSE : flush 안된 나머지 데이터를 저장하고 커서의 자원을 해제한다
일반적인 사용 예제EXEC SQL PREPARE ins_mcode FROM “insert into manufact values
(?,?)” ;EXEC SQL DECLARE mcode CURSOR FOR ins_mcode;EXEC SQL OPEN mcode;/* 데이터가 있는 만큼 루프 순환 */EXEC SQL PUT mcode from :the_code, :the_name ;/* 일정 주기마다 flush 또는 루프가 끝났을때 */EXEC SQL FLUSH mcode ; /* 순환 끝 */EXEC SQL CLOSE mcode ;
System admin 작업 System Admin 작업 서버의 상태 확인 서버의 구동 및 종료 서버에 추가 디스크 할당 backup ISA 이용
155INFORMIX User Guide
System Admin 작업
서버의 환경 구성을 결정 , 변경 서버의 상태를 Monitoring 서버의 자원의 할당 및 제거 서버의 backup
156INFORMIX User Guide
서버의 상태 확인
onstat 명령어를 이용함 onstat -
서버의 상황 요약을 볼 수 있음 .Informix Dynamic Server 2000 Version 9.21.UN205 -- On-Line -- Up 4 days
02:04:05 -- 19456 Kbytes
onstat -m 서버의 최근 메세지 로그를 확인 .16:51:56 Fuzzy Checkpoint Completed: duration was 0 seconds, 42 buffers
not flushed.16:51:56 Checkpoint loguniq 500, logpos 0x25218c17:26:56 Fuzzy Checkpoint Completed: duration was 0 seconds, 42
buffers not flushed.17:26:56 Checkpoint loguniq 500, logpos 0x25518c18:51:56 Fuzzy Checkpoint Completed: duration was 0 seconds, 42
buffers not flushed.18:51:56 Checkpoint loguniq 500, logpos 0x26b18c
157INFORMIX User Guide
서버의 구동 및 종료
Informix user 로 작업하여야 한다 . 구동
oninit
onstat - 로 확인Informix Dynamic Server 2000 Version 9.21.UN205 -- On-Line -- Up 0 days
00:00:05 -- 19456 Kbytes
종료 onmode -ky
158INFORMIX User Guide
서버에 추가의 disk 할당
onspaces 명령 이용 (informix user 로 작업 ) 예 >
/usr/home/informix/chunk1 이라는 file 을 informix dbspace1 이라는 이름으로 100M 만큼 사용하게 하고자 한다면
touch /usr/home/informix/chunk1 chmod 660 /usr/home/informix/chunk1 onspaces -c -d dbspace1 -s 100000 -o 0 -p /usr/home/informix/chunk1
Raw device(mount 되지 않은 disk 영역 ) /dev/rvol01 (size 100M,offset 512K) 을 informix 기존에 존재하는 dbspace1 에 추가하려면
chown informix:informix /dev/rvol01 chmod 660 /dev/rvol01 onspaces -a -d dbspace1 -s 100000 -o 512 -p /dev/rvol01
159INFORMIX User Guide
Backup
시스템 장애시 복구를 위해 전체 database 시스템의 backup 은 필수적이다 . 종류
Ontape Tape device 로 backup 가능 , incremental backup 지원 Backup : ontape -s Restore : ontape -r
Onbar 외부 storage manager 를 통한 backup 지원 좀더 빠른 작업 가능 Backup : onbar -b Restore : onbar -r
160INFORMIX User Guide
ISA 의 이용
Common Hyperlinks
Interpreted onstat -loutput
Related controls
Menu
onstat - on every page
Client/Server Connectivity
client 연결 단계 server 구성 예시 Client-SDK 연결 – Setnet32 설정 Client-SDK 연결 – ilogin 테스트 Client-SDK 연결 – ODBC 설정 JDBC 연결 Remote Database Access
162INFORMIX User Guide
Client 연결 단계
Client 의 $INFORMIXSERVER 환경변수를 체크한다 $INFORMIXDIR/etc/$INFORMIXSQLHOSTS 파일에서
$INFORMIXSERVER 환경변수값과 연결 방법을 찾고 , 어느 서버에 연결할지 읽는다
$INFORMIXSQLHOSTS 변수가 정의되지 않았다면 sqlhosts 파일
$INFORMIXDIR/etc/$ONCONFIG 파일의 DBSERVERNAME 또는 DBSERVERALIASES 파라매터 값과 비교한다
$ONCONFIG 변수가 정의되지 않았다면 onconfig 파일
$INFORMIXSERVER
dbservername nettype hostname servicename
$INFORMIXDIR/etc/$INFORMIXSQLHOSTS
:DBSERVERNAMEDBSERVERALIASES:
$INFORMIXDIR/etc/$ONCONFIG/etc/services 파일 참조/etc/hosts 파일 참조
163INFORMIX User Guide
서버 구성 예시
$INFORMIXDIR/etc/$ONCONFIG (default : onconfig)DBSERVERNAME ids921uc3 # Name of default database serverDBSERVERALIASES ids921uc3tcp # List of alternate dbservernames
$INFORMIXDIR/etc/$INFORMIXSQLHOSTS (default : sqlhosts)ids921uc3 onipcshm kor-olive sqlexec ids921uc3tcp ontlitcp kor-olive service921
/etc/hosts201.231.242.100 kor-olive
/etc/servicesservice921 31236/tcp
네트워크 통신을 지정하는 항목으로SUN, IBM 등은 ontlitcp 를 , HP, linux 등은 onsoctcp 를 사용한다 .시스템별로 사용하는 nettype 의 종류는 release note 를 확인한다
공유메모리 통신 방법으로/etc/services 에 servicename 이등록될 필요없다
164INFORMIX User Guide
Client-SDK 연결 - Setnet32 설정
Environment DB Server 의 환경변수에 맞게 설정
GLS 한글 사용시• DB_LOCALE=ko_kr.ksc• CLIENT_LOCALE=ko_kr.ksc
NLS 사용시 (HP 의 예 )• DB_LOCALE=en_us.8859-1• CLIENT_LOCALE=en_us.8859-1
DB 서버의 환경변수DB_LOCALE=ko_kr.kscCLIENT_LOCALE=ko_kr.kscSERVER_LOCALE=ko_kr.ksc
DB 서버의 환경변수 (HP 예 )DBNLS=2LANG=CLC_CTYPE=english
165INFORMIX User Guide
Client-SDK 연결 - Setnet32 설정
Server Information Informix Server
sqlhosts 에서 nettype 필드가 on***tcp 인 서버가 onconfig 에 있는 서버인지 확인하고 맞다면 그 서버명을 넣는다
HostName windows\hosts 파일이나 winnt\
system32\driver\etc\hosts 에 host명이 등록되어 있다면 그 host 명을 사용하고 그렇지 않다면 ip 를 직접 적어 준다
ProtocolName onsoctcp
ServiceName windows\services 파일이나 winnt\
system32\driver\etc\services 파일에 port 이름이 등록되었다면 그 port 이름을 사용하고 그렇지 않다면 port 번호를 직접 적어 준다
ids921uc3 onipcshm kor-olive sqlexec
$INFORMIXDIR/etc/$INFORMIXSQLHOSTS
ids921uc3tcp ontlitcp kor-olive service921
201.231.242.100 kor-olive
/etc/hosts
service921 31236/tcp
/etc/services
166INFORMIX User Guide
Client-SDK 연결 - Setnet32 설정
Host Information Current Host
Server Information 에서 입력한 host 명이 그대로 넘어온다 User Name
데이터베이스에 접근할 수 있는 사용자 id 를 넣는다 Password Option
Password Password
password 를 입력한다
167INFORMIX User Guide
Client-SDK 연결 - ilogin 테스트
setnet32 로 설정한 정보가 올바른지 확인한다 데모 데이터베이스에 customer 란 테이블이 있어야 결과물이 출력되지만 , 이 테이블이 없거나 데이터가 없어도 테스트 성공 여부는 판단할 수 있다
168INFORMIX User Guide
Client-SDK 연결 - ODBC연결
제어판에서 ODBC 아이콘을 클릭하여 ODBC 소스를 만든다 Setnet 과 달리 DB 정보를 포함하므로 DB 가 여러개이면 각각 Data
Source Name 을 만들어야 한다
169INFORMIX User Guide
Client-SDK 연결 - ODBC연결
ids921uc3 onipcshm kor-olive sqlexec
$INFORMIXDIR/etc/$INFORMIXSQLHOSTS
ids921uc3tcp ontlitcp kor-olive service921
201.231.242.100 kor-olive
/etc/hosts
service921 31236/tcp
/etc/services
setnet32 를 설정했다면위의 정보가 자동으로 로드된다(Database Name, User Id, Password 제외 )NLS DB 의 경우 데이터베이스 리스트에서에러가 발생할 수 있는데 무시하고 직접 입력한다
setnet32 과 마찬가지로NLS DB 의 경우 en_us.8859-1,GLS 한글 DB 는 ko_kr.ksc 로 설정한다
170INFORMIX User Guide
JDBC 연결
환경변수 PATH (java 실행이 가능하도록 한다 )
export PATH=$PATH:/opt/java1.2/bin CLASSPATH ( 현재 디렉토리와 ifxjdbc.jar 를 포함한다 )
export PATH=$CLASSPATH:/opt/jdbc/lib/ifxjdbc.jar:.
JDBC connection URL jdbc:informix-sqli://host 명 :port 번호 /DB 명 :informixserver=informix
서버명 ;user= 사용자 ID;password=패스워드
jdbc:informix-sqli://201.231.242.100:31236/stores_demo:informixserver=ids921uc3tcp;user=informix;password=informix
171INFORMIX User Guide
JDBC 연결
데모 JDBC 설치 디렉토리 /demo/basic/DBConnection.java 로 테스트한다 Connection URL 에 DB 명을 직접 넣는 방법과 DB 명없이 연결한 후 , SQL 구문
“database DB 명 ;” 을 실행시키는 방법으로 테스트 한다 데모 데이터베이스 testDB 를 먼저 만들어 놓아야 한다 예 )
$ javac DBConnection.java $ java DBConnection
jdbc:informix-sqli://201.231.242.100:31236:informixserver=ids921uc3tcp;user=informix;password=informix
>>>Database Connection Direct test. URL =
"jdbc:informix-sqli://201.231.242.100:31236/testDB:informixserver=ids921uc3tcp;user=informix;password=informix"
>>>End of Database Connection Direct test. >>>Database Connection Indirect test. URL =
"jdbc:informix-sqli://201.231.242.100:31236:informixserver=ids921uc3tcp;user=informix;password=informix"
>>>End of Database Connection Indirect test.
172INFORMIX User Guide
JDBC 연결
NLS DB 와 JDBC JDBC 는 NLS 를 지원하지 않으므로 URL 에 직접 DB 명을 쓸 수 없다 “database DB 명”구문을 사용하면 SQLException 으로 빠져나가는데 ,
getErrorCode() 는 0을 반환한다 . 따라서 위의 구문을 사용하면서 DB 에 연결할 때 , getErrorCode 값을 체크하여 0
이면 정상적으로 처리하도록 하면 문제없이 사용할 수 있다try { Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement(); try { stmt.executeUpdate(“DATABASE ” + dbname); } catch (SQLException e) { if (e.getErrorCode() != 0 ) e.printStackTrace(); }} catch (Exception e) { if (stmt != null) try { stmt.close(); } catch (Exception e1)
{ e1.printStackTrace(); } if (con != null) try { con.close(); } catch (Exception e2)
{ e2.printStackTrace(); } e.printStackTrace();}
173INFORMIX User Guide
Remote Database Access
Local 데이터베이스를 연결한 상태에서 현재 연결 정보를 끊지 않고 즉시 다른 데이터베이스에 대해 조회 , 수정 , 삭제 등이 가능하다
DB명@서버명:소유자.테이블명 구문을 사용하는데 , 소유자는 지정하지 않아도 상관없다 . 동일 서버의 다른 데이터베이스라면 서버명을 지정하지 않아도 된다 .
ids731uc4 onipcshm kor-k400 sqlexec
$INFORMIXDIR/etc/$INFORMIXSQLHOSTS
ids921uc3tcp onsoctcp kor-olive service921
ids731uc4tcp onsoctcp kor-k400 service731
ids921uc3 onipcshm kor-olive sqlexec
$INFORMIXDIR/etc/$INFORMIXSQLHOSTS
ids921uc3tcp ontlitcp kor-olive service921
ids731uc4tcp ontlitcp kor-k400 service731
server : ids921uc3DB : stores7table : customer
server : ids731uc4DB : stores_demotable : state
select * from stores_demo@ids731uc4tcp:state ;
insert into stores7@ids921uc3tcp:customer (customer_num, fname, lname)values (0, ‘first name’, ‘second name’);
174INFORMIX User Guide
Remote Database Access
Remote 데이터베이스를 접근하기 위해서는 OS 레벨에서 사용자의 인증을 통과할 수 있어야 한다 . 예를 들어 , remote 서버로 password 입력없이 rlogin 이 되는 상태가 우선 만들어져야 한다
Remote 데이터베이스의 테이블을 쓰기 위한 구문이 길고 복잡하기 때문에 create synonym 을 사용하여 동의어를 만들면 사용하기 간편하다 구문 : create synonym synonym 명 for 테이블명
create synonym remote_state for stores_demo@ids731uc4tcp:state; create synonym remote_customer for stores7@ids921uc3tcp:customer; select * from remote_state; select * from remote_customer;
일반 테이블과의 구분방법 select tabname, tabtype from systables where tabid > 99; 일반 테이블은 tabtype 이 ‘ T’, synonym 테이블은 ‘ S’, view 는 ‘ V’ 로 표시된다
Data Migration
Data Migration Tool SQL unload / load 구문 SQL unload / load 구문 - deimiter dbload dbload - option dbload – delimiter / mapping dbload – fixed length / null 입력 dbexport dbimport 파일 구조 및 스키마 변경 onunload onload HPL (High Performance Loader)
176INFORMIX User Guide
Data Migration Tool
SQL unload / Load 구문 dbload dbexport / dbimport onload / onunload High Performance Loader (HPL)
177INFORMIX User Guide
SQL unload / load 구문
unload unload 는 기존의 존재하는 파일이 있다면 덮어쓴다 (overwrite) varchar컬럼의 데이터 중 후행 공백은 보존된다 예
unload to ‘/tmp/cust.unl’ select * from customer;
load load 하려는 테이블에 이미 존재하는 행이 있다면 계속 추가 (append) 된다 serial 컬럼이 있는 테이블에 자료를 순차적으로 다시 넣으려면 데이터 파일에 해당
되는 컬럼 데이터를 0으로 넣는다 delimiter 사이에 아무 값도 없는 경우 null 이 입력된다 예
load from ‘cust.unl’ insert into customer;
178INFORMIX User Guide
SQL unload/load 구문 - delimiter지정
Default 값을 파이프 기호 (|) 이다 Delimiter 지정
load from ‘file’ DELIMITER ‘,’ insert into table; DBDELIMITER 환경 변수를 지정할 수 있다
Delimiter 로 역슬래시 (\), 개행문자 (newline character), 16진수를 사용할 수 없다
Delimiter 로 tab 이나 공백 (blank) 는 사용가능하다
179INFORMIX User Guide
dbload
delimiter 로 구분된 데이터파일이나 고정길이 (fixed length) 의 데이터 파일 모두 지원한다
사용하기 전에 먼저 command 파일을 만들어야한다 unload 는 지원하지 않는다 다음과 같은 설정을 할 수 있다
필드 매핑 NULL 값 대체 커밋 (commit) 간격 최초 무시하고 읽을 데이터 행 수 에러를 무시하고 넘어갈 수 있는 행 수 테이블의 locking 방법
180INFORMIX User Guide
dbload - option
dbload [-d DB 명 ] [-c command 파일명 ] [-l 로그파일명 ] [-e number] [-n number] [-i number] [-s] [-p] [-r | -k] [-X]
-e : 종료되기 전까지 허용할 에러 갯수 -n : 지정한 숫자만큼 로드 후 commit -i : 지정한 숫자만큼 데이터행을 스킵하고 로드하기 시작한다 -s : syntax error 만 체크한다 -p : commit 할 것인지 rollback 할 것인지 대답해야 한다 -r : 테이블에 lock 을 걸지 않고 로드한다 (default)
insert 되는 행에 대해서만 lock 이 걸린다 -k : 테이블에 exclusive lock 을 걸고 로드한다 -X : HEX binary 데이터를 문자형 컬럼에 로드하고자 할때 사용한다
181INFORMIX User Guide
dbload - delimiter / mapping
command file (delimiter)vi /work/export/command_file.txtFILE sample.txt DELIMITER ‘|’ 4;INSERT INTO sample;
실행 dbload -d DB 명 -c /work/export/command_file.txt -l 에러로그파일
필드 매핑 방법vi /work/export/command_file2.txtFILE sample2.txt DELIMITER ‘ ‘ 4;INSERT INTO sample (id, flag, amount, memo)VALUES (f03,’constant_value’,f02, f01);
미리 정의된 변수 f01, f02, f03..등에 의해서 데이터 파일의 필드를 지정할 수 있다
182INFORMIX User Guide
dbload - fixed length / null 입력
command file (fixed length)FILE cust_address.unl( city 1-15, state 16-17, area_code 23-25 NULL = ‘xxx’, phone 23-34 NULL = ‘xxx-xxx-xxxx’, zip 18-22, state_area 16-17 : 23-25, cust_number 26-32);INSERT INTO locale (cust_id, city, state, zip)VALUES (cust_number, city, state, zip);INSERT INTO mail_sort VALUES (area_code, zip);
데이터 중 23-25번째 자리에 xxx 로 표시된 곳은 null 을 입력한다 state_area 는 여러 위치의 값을 하나로 연결하여 만든다 한 데이터 파일에 대해서 여러개의 insert 문장을 사용할 수 있다
183INFORMIX User Guide
dbexport
전체 데이터베이스를 ASCII 파일로 export받는다 데이터베이스의 스키마 파일을 생성한다 명령어 수행 중에는 데이터베이스에 exclusive lock 이 걸린다 각각의 테이블을 순차적으로 unload받는다 -ss옵션을 사용하면 테이블의 dbspace옵션 , extent옵션 , lock mode옵션 , fragment옵션을 모두 기록한다
예dbexport stores
현재 디렉토리에 stores 데이터베이스를 export받는다
dbexport stores -ssdbexport stores -ss -o /work/exports
export받을 위치를 /work/exports 디렉토리로 지정한다
dbexport stores -ss -t /dev/rmt0 -b 1024 -s 1024000 -f /tmp/stores.sql unload 데이터는 테이프 /dev/rmt0 에 , 스키마 파일은 / tmp/stores.sql 로 저장한다
184INFORMIX User Guide
dbimport
dbexport 로 받은 데이터를 DB 를 생성하고 로드한다 명령 실행 중 데이터베이스에는 exclusive lock 이 발생한다 데이터를 로드하기전에 순차적으로 테이블을 생성하고 로드 한 후 인덱스를
만든다 DB 를 생성할 때 logging 모드로 생성할 수 있지만 데이터 로드 후에
로깅모드를 설정하는 것이 훨씬 더 좋다 PDQPRIORITY 를 100으로 설정하고 작업을 시작하면 성능이 좋다 예
dbimport stores현재 디렉토리에 export받아진 stores 데이터베이스를 import 한다
dbimport stores -i /work/exports/work/exports 에 export받아진 stores 데이터베이스를 import 한다
dbimport stores -d dbs1데이터베이스를 dbs1 에 생성한다 (default 는 rootdbs 에 생성됨 )
185INFORMIX User Guide
파일 구조 및 스키마 변경
dbexport 를 실행하면 다음과 같은 파일 구조로 데이터를 받는다 DB 명 .exp 디렉토리
DB 명 .sql 스키마파일 각 테이블별 unload 파일
테이블 스키마를 변경하고 dbimport 하려면 DB 명 .exp디렉토리안의 DB명 .sql 파일안에서 내용을 먼저 수정한다
데이터베이스 이름을 변경하려면 DB 명 .exp 디렉토리를 다른 이름으로 바꾸고 , 그 디렉토리 안의 DB 명 .sql 파일도 다른 이름으로 바꾸어야한다dbexport DB100mv DB100.exp DB200.expcd DB200.expmv DB100.sql DB200.sqlcd ..dbimport DB200
186INFORMIX User Guide
onunload
Informix 서버의 데이터페이지 바이너리 이미지를 unload 한다 unload/load 문 보다 속도가 빠르다 테이프나 파일 시스템으로 저장한다 데이터베이스 전체 또는 테이블 별로 unload 할 수 있다 unload 하는 동안 테이블에는 shared lock 이 발생한다 테이프 디바이스를 사용할 때 -t, -s -b옵션을 쓰는데 , -l 옵션을 사용하면
Informix 서버의 config 중 LTAPEDEV, LTAPEBLK, LTAPESIZE 값을 그대로 사용하게 된다
예onunload -t /dev/rmt0 -s 20000 -b 32 storesonunload -t /dev/rmt0 -s 20000 -b 32 stores:customeronunload -l stores
187INFORMIX User Guide
onload
onunload 로 받은 데이터를 load 한다 다음과 같은 제한이 있다
Informix 서버의 데이터페이지 크기가 동일해야 한다 시스템의 byte 정렬 방법 및 숫자의 저장 포맷이 동일해야한다 Informix 버전이 동일해야 한다
onload 를 수행하면서 데이터베이스 및 테이블을 생성한다 onload 수행하는 동안 테이블에는 exclusive lock 이 발생한다 예
onload -t /dev/rmt0 -b 32 -s 20000 storesonload -l -d dbs1 stores7
188INFORMIX User Guide
iploadipload
• xterm window 에서 실행• onpload database 에 저장할
정보를 생성하고 onpload 를 실행
onploadonpload
onploaddatabase
targetdatabase
DB 서버DB 서버
tape file pipe
HPL - overview
대용량의 데이터를 migration 하는데 우수한 성능을 나타내도록 디자인된 유틸리티이다
• Ipload 를 최초로 실행시킬 때 생성• onpload 실행을 위한 정보를 저장
• Unload, load 작업을 실제로 수행함• command 로 직접 수행할 수 있고 ,
ipload 에서 호출하여 사용될 수 있다
189INFORMIX User Guide
HPL - load 모드
Deluxe 모드 constraint, index, trigger 가 적용된 상태에서 로드 data replication 상태에서 로드 가능 로드 중에 다른 사용자가 그 테이블을 접근할 수 있다 모든 데이터 타입을 지원한다
Express 모드 Deluxe 모드 보다 속도가 빠르다 로드 중에는 constraint, index, trigger 를 disable 시킨다 로드 중에 테이블에 lock 를 사용한다 standard 데이터 타입만을 지원한다 로드 후 0 레벨 백업을 받기 전까지는 읽기 전용 상태로 남는다 Informix 서버의 페이지 크기 보다 큰 row 의 테이블은 로드 할 수 없다 ROWID 를 사용한 fragment 테이블은 로드 할 수 없다
190INFORMIX User Guide
HPL - 에러 검출
로드 작업 중 constraint 에러가 발생하거나 (deluxe 모드 ), disable 된 constraint 를 enable 시킬 때 에러가 발생하면 (express 모드 ) 에러가 발생한 행에 대한 정보를 violation 테이블과 diagnostics테이블에 저장한다
set constraint enabled
violation table (table 명 _vio) diagnostics table (table 명 _dia)
에러가 발생된 행 에러를 발생한 constraint 정보
기존 Table컬럼
Informix_tupleid
Informix_optype
Informix_recowner
serial
char(1)
char(8)
I=InsertD=DeleteO=Update ( 이전값 )N=Update ( 변경값 )S=Set command
Informix_tupleid
Obj_type
Obj_owner
integer
char(1)
char(8)
Obj_name char(18)
C=constraintI=Unique index
191INFORMIX User Guide
HPL - 에러 수정
Violation 테이블에 filtering 된 행을 읽고 그 원인이 무엇인지 찾아서 violation 테이블을 수정하고 기존 테이블에 입력한다update original_tab_vio set col1 = 123 where col1 = 100;insert into orginal_tab select col1, col2, col3 from orginal_tab_vio where informix_tupleid = 1;
시스템 카타로그 테이블을 모니터링하여 현재 데이터베이스안에 어느 테이블의 constraint, index, trigger 가 disable 된 상태로 남아 있는지 알 수 있다select tabname, objtype, state from systables a, sysobjstate b where a.tabid = b.tabid
objtype : C=Constraint, I=Index, T=Trigger state : D=Disabled, E=Enabled, F=Filtering with no error, G=Filtering with error
192INFORMIX User Guide
HPL - onpladm
onpladm 은 x-window 의 GUI 환경에서 동작하는 ipload 를 대신하여 command line 에서 사용할 수 있는 유틸리티이다
job 생성 , 수정 , 삭제 , 실행을 모두 할 수 있다 job 생성 구문
onpladm create job JOB 이름 -d DEVICE 이름 -D DB 명 -t TABLE 이름 -f [lu]
onpladm create job customer2 -d /tmp/pload/customer2.unl -D stores_demo -t customer2 -fu
job 을 생성하면 query 와 device 등의 정보도 자동적으로 함께 생성된다
job 리스트 보기 onpladm list job onpladm list query onpladm list device
193INFORMIX User Guide
HPL - onpladm
Job 실행 onpladm run job JOB 이름 -f [lu] [-l 로그파일이름 ]
onpladm run job customer2 -fu -l 옵션을 사용하면 화면상에 출력되는 메시지가 지정한 파일로 저장된다
Job 내용보기 onpladm describe job customer2 -fu onpladm describe query customer2 onpladm describe device customer2
Job 삭제 job 을 삭제해도 query 나 device 등에 대한 정보는 남고 , unload, load job 은
각각 삭제해야 한다 onpladm delete job customer2 -fl onpladm delete job customer2 -fu onpladm delete job query customer2 onpladm delete job device customer2
194INFORMIX User Guide
HPL - onpladm
Command 로 제어할 수 없는 몇 가지 정보는 onpload 데이터베이스를 직접 수정하여 사용한다 .
모든 테이블의 key컬럼은 name 이다 delimiter 변경
formats 테이블에서 fieldsep 컬럼 수정 한글 로케일 사용 (ko_kr.ksc)
formats 테이블에서 datatype 컬럼 값을 ASCII 에서 KS5601 로 변경 run mode 변경
session 테이블의 runmode 컬럼 수정 load
no conversion --> 2 : express, 129 : deluxe, conversion --> 130 : express, 386 : express (filtering 하지 않음 )
unload no conversion --> 2 conversion --> 129: Dirty read, 130:Commited Read, 131:Cursor stability, 132:Repeatable Read
Backup & Restore
ontape ontape 옵션 ontape 백업 ontape 로깅 모드 변경 ontape warm restore ontape cold restore onbar onbar 실행
196INFORMIX User Guide
ontape
Informix 서버의 데이터 저장 및 복원 , 로그 백업 및 복구를 위한 단순한 형태의 백업 유틸리티
기능 데이터베이스 시스템 레벨에서의 저장 및 복구 변동 사항 백업 및 복구 (incremental backup)
0 레벨 , 1 레벨 , 2 레벨 일반 데이터와 로그 백업 장치를 구분 가능 로그 백업
Automatic(on-demand) - 백업 받지 않은 모든 논리 로그를 백업 Continuous - 각 논리로그가 가득 차면 연속적으로 백업
데이터 영역 선택적 복구 Cold Restore
기본청크 rootdbs 나 로그가 포함된 dbspace 복구 서버가 정지 상태일때 복구 가능
Warm Restore rootdbs 와 로그가 포함된 dbspace 에 접근 가능한 서버 동작 상태에서 복구
197INFORMIX User Guide
ontape 옵션
ontape -a | -c | -l | -p | -r [ -D dbspace_list ] |
-s [ -L archive_level ] [-A | -B | -N | -U [database_list] ]
-a : 논리 로그 automatic backup -c : 논리 로그 continuous backup -l : 논리 로그 복구 -p : HDR 의 물리적 복구 -r : 전체 시스템 복구
-D : 선택한 dbspace 복구 -s : 전체 시스템 백업
-L : 0, 1, 2 레벨 지정 -A : ANSI logging 모드로 변환 -B : Buffered logging 모드로 변환 -N : No logging 모드로 변환 -U : Unbuffered logging 모드로 변환
198INFORMIX User Guide
ontape 백업
전체 백업 ontape -s
Please enter the level of archive to be performed (0, 1, or 2) 0Please mount tape 1 on /dev/rst0 and press Return to continue…10 percent done.100 percent done.Please label this tape as number 1 in the arc tape sequence.This tape contains the following logical logs: 2Program Over.
로그 백업 ontape -a
Performing automatic backup of logical logs.Please mount tape 1 on /dev/rst0 and press Return to continue…Do you want to back up the current logical log? (y/n) yPlease label this tape as number 1 in the arc tape sequence.This tape contains the following logical logs: 1 - 3Program Over.
199INFORMIX User Guide
ontape 로깅 모드 변경
No logging 상태에서 다른 logging 상태로 변경하려면 백업 정보가 필요 신속한 로깅 변경을 위하여 $INFORMIXDIR/etc/$ONCONFIG (default :
onconfig) 파일의 TAPEDEV 파라매터를 /dev/null 로 변경하고 ontape 명령을 실행한다
로깅 모드 변경 ontape -s -B stores_demo ontape -s -U stores_demo
200INFORMIX User Guide
ontape warm restore
Warm restore ontape –r –D dbs2
DBSpace ‘dbs2’ is online; restoring ‘dbs2’ will bring all chunks comprising the DBSpace OFFLINE and will terminate all active transactions and queries accessing the DBSpace.
OK to continue? yPlease mount tape 1 on /dev/rst0 and press Return to continue …
Archive Tape InformationTape type: Archive Backup TapeOnline version: INFORMIX-OnLine Version 9.21.UC1Archive date: Thur Dec 14 10:10:12 2000User id: informixTerminal id: /dev/ttyp2Archive level:0Tape device: /dev/rst0Tape blocksize (in k): 16Tape size (in k): 10240Tape number in series: 1
Continue restore? (y/n) yRestore a level 1 or 2 archive (y/n) nDo you want to restore log tapes? (y/n) yPlease mount tape 1 on /dev/rst0 and press
Return to continue …Do you want to restore another log tape? (y/n)
nProgram over.
201INFORMIX User Guide
ontape cold restore 1/3
cold restore ontape –r
Please mount tape 1 on /dev/rst0 and press Return to continue …
Archive Tape Information
Tape type: Archive Backup TapeOnline version: INFORMIX-OnLine Version 9.21.UC1Archive date: Thur Dec 14 10:10:12 2000User id: informixTerminal id: /dev/ttyp2Archive level:0Tape device: /dev/rst0Tape blocksize (in k): 16Tape size (in k): 10240Tape number in series: 1
Continue restore? (y/n) y
202INFORMIX User Guide
ontape cold restore 2/3
Archive InformationINFORMIX-OnLine Copyright© 1986,1987 Informix Software, Inc.
Initialization Time 12/12/2000 11:20:22System Page Size 2048Version 2Archive Checkpoint Time 12/12/2000 11:21:13
DbspacesNumber flags fchunk nchunks flags owner name1 1 1 N informix rootdbs1 2 1 N informix dbs2
Chunkschk/dbs offset size free bpages flags pathname1 5000 5000 3201 PO- /dev/chunk12 10000 5000 4747 PO- /dev/chunk1
203INFORMIX User Guide
ontape cold restore 3/3
Continue restore? (y/n) yDo you want to back up the logs? (y/n) y(note: this is the log salvage step)Please mount tape 1 on /dev/rst0 and press Return to continue
Restore a level 1 or 2 archive (y/n) nDo you want to restore log tapes? (y/n) yRoll forward should start with log number 3
Please mount tape 1 on /dev/rst0 and press Return to continue …
Do you want to restore another log tape? (y/n) n
Program over.
204INFORMIX User Guide
onbar
X/Open Backup Service Application Programming Interface (X/BSA) 를 통해 Storage Manager 를 사용하여 병렬적으로 데이터 백업 및 복구
StorageManager
On-Bar
Buffers인포믹스 서버
SysutilDB
DebugFile
On-BarLog
OnlineLog
BootFile
OnconfigFile
Dbspaces , Logs
X/BSATra
nsp
ort
SMMessage
File SMCatalog
BackupMedia
Command Line Utility
ISA
Third Part GUI Tool
205INFORMIX User Guide
onbar
onbar 백업 및 복구에 대하여 storage manager 에게 요청하고 정보를 전달
storage manager storage device 와 media 를 관리 Informix storage manager 또는 third part 제품사용
onbar catalog sysutils 데이터베이스에 저장
X/BSA 라이브러리 ON-Bar 프로그램은 X/BSA (X/Open Backup Service API) 를 사용하여 저장
관리자와 정보를 교환 . X/BSA 는 데이터베이스와 저장 관리자 사이에서 백업 및 복구 정보를 교환하기 위해 특별히 개발된 표준 API.
Message File onbar 동작에 대한 정보를 기록 default 는 / tmp/bar_act.log
206INFORMIX User Guide
onbar 실행
백업 onbar -b : 모든 dbspace 백업 onbar -b dbspace1 dbspace2 .. : 지정한 dbspace 백업 onbar -b -L 1 : 1 레벨 백업 onbar -b -w : whole system 백업 . 순차적으로 dbspace백업 .
로그백업 onbar -l -c : 로그 백업 (-c : 현재 로그까지 ) onbar -l -s : salvage 로그 백업
복구 onbar -r : 모든 dbspace 복구 onbar -r dbspace1 dbspace2 .. : 지정한 dbspace 복구 onbar -r -w : whole system 백업본을 복구 onbar -r -t 2001-01-05 16:25:00 : 지정한 시간까지 복구 onbar -r -n log_number : 지정한 로그 번호까지 복구
GLS (Global Language Support)
GLS 란 NLS 및 ALS 에서 GLS 로 migration GLS 환경과 JDBC연결을 통한 한글처리 JSP 에서의 한글 처리
208INFORMIX User Guide
GLS 란
GLS(Global Language Support) 로케일이란 영어권 외의 특정 지역을 위한 언어 환경이다
다음 세가지 환경변수에 의해 결정 된다 CLIENT_LOCALE SERVER_LOCALE DB_LOCALE
로케일 값은 “언어 _ 지역 . 코드셋” 의 포맷으로 구성된다 Default 값은 en_us.8859-1 한글 로케일은 ko_kr.ksc
로케일을 지정함으로써 문자의 정렬 순서 및 멀티 바이트 문자 처리 , 로컬라이즈된 포맷의 날짜형 , 숫자형 , 화폐 등을 나타낼 수 있다
209INFORMIX User Guide
NLS 및 ALS 에서 GLS 로 migration
Informix 7.2버전 이전까지는 NLS(Native Language Support) 또는 ALS(Asian Language Support) 를 지원하였다
이 두 타입의 로케일의 문제점은 OS 에 따라 사용할 로케일이 다르고 , 이렇게 다른 로케일을 사용한 데이터베이스간에서 분산 질의가 정상적으로 동작하지 않으며 질의에 대한 결과가 동일하지 않을 수 있다 참고
HP 의 NLS 설정 LANG=C LC_CTYPE=english DBNLS=2
SUN 의 NLS 설정 LANG=en_US LC_CTYPE=en_US DBNLS=2
GLS 로케일은 Informix 서버에서 제공하는 로케일로 플랫폼이나 OS 와 상관없이 동일한 값을 사용하며 동일한 결과를 리턴한다
210INFORMIX User Guide
GLS 환경과 JDBC연결을 통한 한글처리
JDBC 를 통해서 한글 자료를 처리할 때 Database Server 의 locale 설정에 따라 프로그램 안에서 code conversion 을 해야 하는 경우가 있음
JAVA
char
lvarchar
clob
언어 타입 영문 로케일 (en_us.8859-1) 한글 로케일 (ko_kr.ksc)
C
C
N
N
N
N
JSP
char
lvarchar
clob
N
INSERT : N, SELECT : C
C
C
INSERT : N, SELECT : C INSERT : N, SELECT : C
C : ConversionN : No Conversion
211INFORMIX User Guide
JSP 에서의 한글 처리 (lvarchar)
JSP 를 지원하는 엔진에 의해서 page code conversion 이 자동지원 . 하지만 Lvarchar 와 CLOB 의 경우 SELECT 시에 getString() 이나
getAsciiStream() 을 통해서 자료를 가져오는 경우 conversion 필요
<html><%@ page language="java" import="java.sql.*, java.util.*, java.math.BigDecimal,java.io.*, java.lang.*" %><body><% Statement stmt = null; Connection conn = null; String url = "jdbc:informix-sqli://kor- olive:8012/lob_db:informixserver=y92;user=informix;password=informix"; try { Class.forName("com.informix.jdbc.IfxDriver"); } catch (Exception e) {} try { conn = DriverManager.getConnection(url); } catch (SQLException e) {} int row = 0; String str = null; int rc = 0; ResultSet rs = null;
try { String value = null; stmt = conn.createStatement(); rs = stmt.executeQuery("Select * from lvar"); while( rs.next() ) { row++; value = rs.getString(1); byte[] rawBytes = col1.getBytes("KSC5601"); String result = new String(rawBytes, "8859_1"); }%><font size=2 color=black><%= result%></font> <br><% } catch (Exception e) {} try { stmt.close(); conn.close(); } catch ( SQLException e) {}%></body></html>
212INFORMIX User Guide
JSP 에서의 한글 처리 (clob) - 1/2
CLOB 의 경우 getString() 이나 getAsciiStream() 을 이용하지 않고 Large Object 를 처리하는 method 를 사용하면 conversion 없이 한글 자료를 처리 가능
<html><%@ page language="java" import="java.io.*, java.util.*, java.lang.* ,java.sql.*, com.informix.jdbc.*" %><body><% Statement stmt = null; PreparedStatement pstmt = null; Connection myConn = null; String newUrl = "jdbc:informix-sqli://kor-olive:8012/lob_db:informixserver=y92;user=informix;password=informix"; try { Class.forName("com.informix.jdbc.IfxDriver"); } catch (Exception e) {} try { myConn = DriverManager.getConnection(newUrl); } catch (SQLException e) {} File file; int fileLength; try { pstmt = myConn.prepareStatement("insert into demo1 values (?)"); } catch (SQLException e) {}
213INFORMIX User Guide
JSP 에서의 한글 처리 (clob) - 2/2
file = new File("/program/data.dat"); fileLength = (int) file.length(); StringBufferInputStream stream1 = new StringBufferInputStream("!@#$%^&*()"); try { pstmt.setAsciiStream (1,stream1,stream1.available()); pstmt.executeUpdate(); } catch ( Exception e) { String s = e.toString(); } try { FileInputStream fin; fin = new FileInputStream(file); pstmt.setAsciiStream(1 , fin, fileLength); pstmt.executeUpdate(); } catch ( Exception e) {} try { pstmt.close(); } catch ( Exception e) {} try { stmt = myConn.createStatement(); ResultSet rs1 = stmt.executeQuery("select * from demo1"); IfxCblob clob; String col1 = ""; byte[] rawBytes = col1.getBytes("8859_1");
while( rs1.next() ) { clob = (IfxCblob)rs1.getClob(1); InputStream reader = (InputStream)clob.getAsciiStream(); reader.read(rawBytes); col1 = new String(rawBytes, "8859_1");%><font size=2 color=black><%= col1%></font> <br><% } rs1.close(); stmt.close(); } catch(SQLException e) {} try { stmt.close(); pstmt.close(); myConn.close(); } catch ( SQLException e) {}%></body></html>
The End.
http://www.informix.com