database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
ㆍInformix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Informix Q&A 1822 게시물 읽기
No. 1822
informix91 -> oracle8i migration시 clob,blob 문제
작성자
사슴사랑
작성일
2003-10-16 18:05
조회수
6,710

안녕하세요.초보자 사슴사랑입니다.

이번에 프로젝트중 한 부분이 인포믹스 9.1을 오라클 8i로 마이그레이션하는겁니다.

오라클에서 나온 work bench프로그램도 써봤는데요. CLOB,BLOB,... type등 지원안해주는 type이 많고

테이블당 자료를 불러올수 있는게 아니고 DB를 통째로만 가져올 수 있기 때문에 불가능했습니다.

또 한가지는 실시간 돌고 있는 DB에서만 스키마를 가져올수 있더라고요. -_-;;

오라클 기술직원한테 물어보니 스키마를 클라이언트 pc에 이미지 형태로 저장한다고 합니다.

 

인포믹스에서 예를들어 TEST란 DB를 export 하면 인포믹스에서는 TEST.EXP라는 폴더를 만들고 그 안에 파일로 저장을 하게 됩니다.

데이타파일은 "테이블명XXX.unl" 이런 파일형식의 파일로 저장이 됩니다.

긴 텍스트 컬럼(즉, 엔터를 쳐 가면서 입력한 컬럼)은 엔터친 부분에 \ 기호가 들어가게됩니다.

아래는 제가 만든 control.sql 파일입니다.

 

***************************** control.sql  시작*******************************************************

set echo off
set heading off
set verify off
set feedback off
set show off
set trim off
set pages 0
set concat on
set lines 300
set trimspool on
set trimout on

spool d:\temp1\&1..ctl            ------------->컨트롤파일 생성시 저장되는 경로

select 'LOAD DATA'||chr (10)||
       'INFILE '''||lower (table_name)||'.unl'''||chr (10)||
       'INTO TABLE '||table_name||chr (10)||
       'FIELDS TERMINATED BY ''|'''||chr (10)||
       'TRAILING NULLCOLS'||chr (10)||'('
from   all_tables
where  table_name = upper ('&1');

select decode (rownum, 1, '   ', ' , ')||
       rpad (column_name, 33, ' ')||
       decode (data_type,
               'VARCHAR2', 'CHAR NULLIF ('||column_name||'=BLANKS)',
               'FLOAT',    'DECIMAL EXTERNAL NULLIF('||column_name||'=BLANKS)',
               'NUMBER',   decode (data_precision, 0,
                           'INTEGER EXTERNAL NULLIF ('||column_name||
                           '=BLANKS)', decode (data_scale, 0,
                           'INTEGER EXTERNAL NULLIF ('||
                           column_name||'=BLANKS)',
                           'DECIMAL EXTERNAL NULLIF ('||
                           column_name||'=BLANKS)')),
               'DATE',     'DATE "YYYY-MM-DD"  NULLIF ('||column_name||'=BLANKS)',
  'CLOB',    'LOBFILE(CONSTANT ''&1..clob'') char terminated by "<endlob>"',
  'BLOB',    'LOBFILE(CONSTANT ''&1..blob'') char terminated by "<endlob>"',
               null)
from   user_tab_columns
where  table_name = upper ('&1')
order  by column_id;

select ')' 
from sys.dual;
spool off

***************************** control.sql  끝*************************************************************

 

전 이같이 컨트롤 파일을 우선 생성한 후에

sql/plus 를 열고

edit control

@control "test" <---------DB에 test라는 테이블이 미리 존재해야 됩니다.

이렇게 하고 나면 D:\temp1 폴더에 test.ctl 이라는 파일이 생성됩니다.

 

다음은 test.ctl 파일입니다.

*****************************************test.ctl 시작**************************************************

LOAD DATA
INFILE 'D:\temp1\test.unl' "Str X'7c0a'" <-------"Str X'7c0a'" 가 바로 긴텍스트를 처리하는 부분입니다.
INTO TABLE TEST
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS
(

   SER_NO                           DECIMAL EXTERNAL NULLIF (SER_NO=BLANKS)
 , TITLE                            CHAR NULLIF (TITLE=BLANKS)
 , REG_USER                         CHAR NULLIF (REG_USER=BLANKS)
 , PASSWORD                         CHAR NULLIF (PASSWORD=BLANKS)
 , EMAIL                            CHAR NULLIF (EMAIL=BLANKS)
 , ADDR                             CHAR NULLIF (ADDR=BLANKS)
 , TEL                              CHAR NULLIF (TEL=BLANKS)
 , JOB                              CHAR NULLIF (JOB=BLANKS)
 , FIELD
 , SYNOPSIS                         CHAR(10000) NULLIF (SYNOPSIS=BLANKS) <-----긴텍스트 컬럼의 길이를 길게해줌
 , REG_DATE                         DATE "YYYY-MM-DD"  NULLIF (REG_DATE=BLANKS)
 , COUNTER                          DECIMAL EXTERNAL NULLIF (COUNTER=BLANKS)
)

*****************************************test.ctl 끝*****************************************************

 

이렇게 고치고 나서

다시 sql/plus 에서

sqlldr 계정/비번 입력후

control = "test" 를 입력하면 test.unl에 있는 데이터들이 오라클 TEST테이블로 들어가게 됩니다.

그다음에는 데이터가 잘들어갔는지 test.log파일을 확인해 봅니다.

 

다음은 test.log파일입니다.

***************************************test.log 시작**************************************************8

SQL*Loader: Release 8.1.6.0.0 - Production on Wed Oct 15 19:32:56 2003

(c) Copyright 1999 Oracle Corporation.  All rights reserved.

Control File:   test.ctl
Data File:      D:\temp1\test.unl
  File processing option string: "Str X'7c0a'"
  Bad File:     test.bad
  Discard File:  none specified
 
 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:     64 rows, maximum of 65536 bytes
Continuation:    none specified
Path used:      Conventional

Table TEST, loaded from every logical record.
Insert option in effect for this table: INSERT
TRAILING NULLCOLS option in effect

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
SER_NO                              FIRST     *   |       CHARACTER           
    NULL if SER_NO = BLANKS
TITLE                                NEXT     *   |       CHARACTER           
    NULL if TITLE = BLANKS
REG_USER                             NEXT     *   |       CHARACTER           
    NULL if REG_USER = BLANKS
PASSWORD                             NEXT     *   |       CHARACTER           
    NULL if PASSWORD = BLANKS
EMAIL                                NEXT     *   |       CHARACTER           
    NULL if EMAIL = BLANKS
ADDR                                 NEXT     *   |       CHARACTER           
    NULL if ADDR = BLANKS
TEL                                  NEXT     *   |       CHARACTER           
    NULL if TEL = BLANKS
JOB                                  NEXT     *   |       CHARACTER           
    NULL if JOB = BLANKS
FIELD                                NEXT     *   |       CHARACTER           
SYNOPSIS                             NEXT 10000   |       CHARACTER           
    NULL if SYNOPSIS = BLANKS
REG_DATE                             NEXT     *   |       DATE YYYY-MM-DD     
    NULL if REG_DATE = BLANKS
COUNTER                              NEXT     *   |       CHARACTER           
    NULL if COUNTER = BLANKS


Table TEST:
  102 Rows successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.


Space allocated for bind array:                  64200 bytes(5 rows)
Space allocated for memory besides bind array:        0 bytes

Total logical records skipped:          0
Total logical records read:           102
Total logical records rejected:         0
Total logical records discarded:        0

Run began on Wed Oct 15 19:32:56 2003
Run ended on Wed Oct 15 19:33:00 2003

Elapsed time was:     00:00:04.16
CPU time was:         00:00:00.11

***************************************test.log 끝**************************************************

 

이렇게 이상없으면 잘 들어간겁니다.

 

제가 한거는 여기까지고요.

잘 안돼는부분이 바로 CLOB,BLOB 필드문제입니다.

export파일중에 DB명.sql 파일에는 모든 스키마정보가 다 들어있습니다.

(create문,alter문,insert문,스토어드프로시져, 함수 등등)

 

예를 들면 wowen.sql 파일이 있고, 그 안에 아래처럼 되 있습니다.

{ TABLE "informix".wonews row size = 536 number of columns = 14 index size = 12 }
{ unload file name = wonew00402.unl number of rows = 3425 }

create table "informix".wonews
  (
    ser_no integer not null constraint "informix".n1750_6098,
    code1 char(3),
    title varchar(200),
    context clob,
    inp_date char(10),
    writer varchar(50),
    ck1 char(1),
    ck2 char(1),
    ck3 char(1),
    inq_cnt integer,
    cu_date datetime year to second,
    filename varchar(50),
    filetype varchar(50),
    whole blob,
    primary key (ser_no) constraint "informix".u1750_6097
  )

 

밑줄친 wonew00402.unl 파일을 보면 데이터 들이 이렇게 들어가 있습니다.

3|010|'Women's Studies Forum' (Vol. 16) 발간|0,121,clob5c84.acd|2001.02.01|| | | |100|||||

 

컬럼 구분은 "|"로 보시면 됩니다. 여기서 문제가 되는 0,121,clob5c84.acd 부분이 있습니다.

0,121 이라는 숫자는 clob5c84.acd 라는 파일에서 0번째 바이트부터 121번째 바이트까지의 데이터를 가리킵니다.

 

전 이부분을 해결하고 싶은데요. 고수님들 좀 알려주시면 감사드리겠습니다.

마이그레이션이 이렇게 힘든지 정말 몰랐습니다.

 

제발 저에게 구원의 손길을 부탁드립니다.

 

추신 : blob type도 clob type과 같은 방법으로 해결될 수 있을까요?

 

수고하세요.

 

[Top]
No.
제목
작성자
작성일
조회
1825프로시져 결과값 별칭주기 질문입니다. [1]
박준호
2003-10-21
3843
1824[질문]두 날짜 사이의 일수 구하기 [2]
이연금
2003-10-20
6554
1823해당dbspace는 남아 있는데... [1]
이성인
2003-10-16
4086
1822informix91 -> oracle8i migration시 clob,blob 문제
사슴사랑
2003-10-16
6710
1821여러 Dbspaces중에 rootdbs만 올라와요... [1]
이성인
2003-10-16
4097
1819max() 와 group by() 를 사용하는 쿼리에 관한 질문드립니다.
믹스초보
2003-10-15
4363
1818CASE WHEN 하는것 어케 만들어야 해요?
노창희
2003-10-14
5269
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다