Oracle Database から DDL 文を生成する SQL スクリプトを作った。
用途は export&import してデータを移行したいけど、表領域の構成を変えたい場合など。
この SQL スクリプトを使ってDDL 文を生成して、表領域の指定を変更して DDL を実行し、ignore=y オプションをつけて import してやれば、テーブルやインデックスを作成する表領域を変更できます。
define owner_name = &owner_name define object_type = &object_type set echo off set termout off set pagesize 0 set head off set feed off set verify off set linesize 10000 set trimout on set trimspool on col spool_file_name new_value spool_file_name format a100 select 'create_'||lower('&&object_type')||'_'||lower('&&owner_name')||'.sql' spool_file_name from dual; spool &spool_file_name select dbms_lob.substr(dbms_metadata.get_ddl(upper('&&object_type'), object_name, owner),3999,1)||'/' from all_objects where owner = upper('&&owner_name') and object_type = upper('&&object_type'); spool off exit
実行してみるとこんな感じ。
- CREATE TABLE文を生成する。
$ sqlplus -s system/manager @create_ddl.sql Enter value for owner_name: scott Enter value for object_type: table
- CREATE INDEX文を生成する。
$ sqlplus -s system/manager @create_ddl.sql Enter value for owner_name: scott Enter value for object_type: index
- テーブルを作成する表領域を変更する。
$ perl -i -ple 's/TABLESPACE\s+\"[a-zA-Z_]+\"/TABLESPACE \"TBS_USERS\"/gi' create_table_scott.sql
- インデックスを作成する表領域を変更する。
$ perl -i -ple 's/TABLESPACE\s+\"[a-zA-Z_]+\"/TABLESPACE \"TBS_IX_USERS\"/gi' create_index_scott.sql
- DDL文を実行してテーブルを作成する。
$ sqlplus system/manager @create_table_scott.sql <<EOF exit EOF
- DDL文を実行してインデックスを作成する。
$ sqlplus system/manager @create_index_scott.sql <<EOF exit EOF