2. 컴퓨터 이야기/데이타베이스

WareValley 의 Orange 와 insert into ~ select ~ 구문을 이용한 데이타 DB 업로드

래빗 크리스 2009. 1. 27. 12:10

이번 작업의 전체 그림은,
1. 일단 Excel 을 통해 데이타를 가공하고
2. 가공된 데이타를 Orange Loader 로 임시테이블에 올리고
3. 임시테이블의 내용을 insert into ~ select 구문으로 본 테이블에 올리는 것입니다.

데이타가 대용량이든 아니든, 일단 가공을 한다면 MS 엑셀로 하는 것이 편합니다. 물론 제한사항은 있습니다. 하나의 워크시트에 65,535 개의 로우만 관리할 수 있다는 것이죠. 이러한 제약사항 때문에 하나의 엑셀 파일에 여러개의 워크시트로 나누어 작업을 하기도 합니다. 물론 오렌지에서 여러 워크시트를 한번에 업로드 할 수 있습니다. 그리고, 일시숫자와 관련된 사항은 엑셀과 DB 툴을 연계하는 작업에서 다루기 힘들지요. 상황에 맞게 작업해야 하는데 텍스트면 일단 안전하다 싶습니다.

DB 관리툴이 상당히 많습니다. 그 중에서 QuestSoft 사의 Toad 와 WareValley 사의 Orange 가 유명합니다.
엑셀과 관련된 작업이라면 Orange 쪽이 더 편리하고, DB 전반의 작업은 Toad 가 낫다고 생각합니다.
Toad 는 값비싼 외산이고, Orange 는 비교적 저렴한 (그래도 기백만원) 국산입니다.
아무튼 이곳에서는 Orange 를 기준으로 설명합니다.

어떤 분은 Toad 나 Orange 를 사용하지 않고 엑셀에서 바로 insert into ~ values ~ 문을 만들어 이용하는 분도 있습니다.
그런데 하나의 테이블만 관련성이 있다면 문제 없지만, 다른 테이블에도 영향을 주는 테이블이라면 대략 곤란합니다.
그래서 엑셀에서 관련 키들을 하나씩 모두 맞춰서 insert ~ 문을 사용하기도 합니다만..
insert ~ select 문이 있으니까 이것을 사용하는 것이 더 낫지 않나 싶습니다. ^^>

먼저 엑셀로 데이타 클린징 작업을 합니다. 코드 안에 '-' 문자가 들어 있기 때문에 이것을 없애려면 substitute 라는 엑셀 함수를 이용합니다. '=substitute(a1, "-", "")' 라고 입력하면 됩니다.
(이미지가 깨어져 보이면 이미지를 클릭해 보세요.)



아래와 같이 '-' 문자가 없어졌습니다. 일자의 경우 텍스트로 처리하는 것이 안전합니다. 셀서식, 일반, 텍스트를 체크합니다.



이제는 Orange 를 이용하여 임시 테이블에 데이타를 업로드 합니다.
아래 그림과 같이 Orange 를 실행하고, 'Load Tool' 을 클릭합니다.



어떤 DB 사용자를 이용하여 데이타를 업로드할 것인지 선택합니다.
본 테이블의 owner 인 DB 사용자이면 됩니다. 그리고 해당 테이블에 insert 권한이 있는 DB 사용자도 물론 됩니다.



Load 탭에서 스키마와 테이블을 선택합니다.



Data File 을 선택합니다.



Table 칼럼과 File 칼럼이 적절하게 매치되는지 확인합니다.
엑셀을 만들때 업로드될 테이블과 구조를 맞추면 상당히 편리합니다.
아래 그림을 보면, 첫줄에 실제 데이타가 아닌 칼럼 명칭이 들어 있습니다.
이것은 불필요한 내용이므로 조치를 취합니다.



'1st row is col name' 항목을 체크해 두면 상기 문제를 해결할 수 있습니다.



'Truncate before loading' 을 체크하면 임시테이블에 이전에 등록되어 있던 내용들을 제거하고 업로드 합니다.
데이타가 한번에 올라가면 좋은데, 오류가 발생해서 몇번에 걸쳐 올려야 한다면 중복 내용이 발생하기 때문입니다.



'Run load/unload' 툴 아이콘을 클릭하여 데이타를 업로드 합니다.
업로드 중에 오류가 나면, 가공된 엑셀파일이 위치한 폴더에 오류 내역이 파일로 저장됩니다.
Total 갯수와 Load 갯수가 다르면, 오류 내역을 참고로 하여 엑셀파일을 재가공 합니다.



자 이제 마지막 단계입니다. 'Run ...' 시리즈들 중에서 상황에 맞게 쿼리를 실행해 줍니다.
임시 테이블에 등록한 만큼 본 테이블에 등록이 완료됩니다.



insert tableA ~ select 문은,
insert into tableA(columnA, columnB, ..., columnZ) select ~ 라고 하는 것이 바람직 합니다.
만약 tableA 에 columnAB 와 같은 신규 칼럼이 등록된다면, tableA(...) 와 같이 일일이 설정하지 않았을때 오류가 발생할 수 있습니다. 반드시 필요한 칼럼들을 모두 사용해 주세요. 모든 칼럼을 다 써주라는 것이 아니라 insert 할 때 필수항목을 쓰라는 것임을 잊지 마세요.. ^^v