오라클은 sql을 실행하여 DDL SQL을 만든다거나 하는 것들이 가능한데
문제는 파일로 저장하면 애매한 부분에서 줄넘김이 되면서
에러를 발생시킨다.
이번에 이동해야 하는건 테이블만 12만개나 있어서
하나식 보면서 할 수가 없어 찾아보니..
여러가지 옵션들이 있어
내 나름대로 정리해 봤다.
#get_ddl.sql
set long 100000
set head off
set feed on
set wrap on
set linesize 3200
set pagesize 0
set trimspool on
set longchunksize 1024
spool insertout.txt
select dbms_metadata.get_dll('TABLE', 'MyTablename', 'MyOwner');
exit
long : 한 필드에 표시되는 문자 수. 적으면 내용이 중간에 잘린다.
head off : 필드명을 없앤다.
feed on : 한 필드 내의 줄넘김을 표시한다. off면 한줄만 표시되면서 다음 줄 이후는 잘린다.
wrap on : ?? 기억이;;
linesize 3200 : 한 줄에 3200글자까지 지원.. 이게 작으면 오른쪽이 잘린다.
pagesize 0 : 한 줄에 표현하는 페이지.. 숫자가 커도 별로 의미 없이 공백만 생기므로 0으로 설정
trimsppo on : 이건 그냥 붙여봤는데 아직 테스트 안함.
lognchunksize 1024 : 오른쪽 글자 잘림을 막아줌(linesize가 있어도 잘리는 경우 이것까지 넣으니까 다음줄로 안넘어가고 옆으로 잘 붙어준다.)
spool filename.sql : filename.sql 파일로 출력해준다.
이렇게 처리하면 sql만 들어가기 때문에
echo "exit" >> filename.sql
등으로 exit을 넣어줘야 cli로 실행하는 경우 먹통이 되지 않는다.
Procedure, Function을 복사하면 저장은 되는데 컴파일 에러가 발생하여 status가 INVALID로 되어 버리는데.. 몇 가지 경우가 있다.
- OWNER가 안맞는 경우 : DBA권한 계정으로 하지말고, 해당 OWNER로 컴파일하면 해결됨.
- DB LINK : 해당 OWNER로 DB LINK를 만들면 해결 됨.
- 다른 Procedure, function, synonym 호출 : 외부 오브젝트가 없어서 생기는 에러일 수 있으니 호출하는 오브젝트를 먼저 만들어줌.
추가 인덱스나 추가 테이블 생성시 Tablespace를 지정하는 것을 자꾸 잊어먹어서 추가..
PK 추가시 테이블 스페이스 작성
alter table TABLE01
add constraint TABLE01_PK primary key (FIELD01)
using index tablespace TBS01;
index 추가시 tablespace작성
create index TABLE01_IX01 on TABLE01(FIELD01) tablespace TBS01;
댓글
댓글 쓰기