Oracle10gインポートエラー対応

https://blog.goo.ne.jp/pianyi/e/3450c78af9fc2f17241f731f55b34db8

※上記サイトより下記抜粋

環境を取ってきた該当SQL:
SELECT PARAMETER,VALUE FROM NLS_DATABASE_PARAMETERS

エクスポートコマンド:
exp userid=test/test@//localhost:1521/aiueo file=aiueo.dmp buffer=10485760 grants=y indexes=y compress=y full=n log=aiueo.log direct=y

インポートコマンド:
IMP USERID=test/test@xe FILE=test.dmp LOG=test FULL=Y COMMIT=Y

普通にこれでインポートすると、エラーが出ます。
ORA-12899: 列"TEST"."TEST_TABLE"."TEST_COLUMN"の値が大きすぎます(実際: 150、最大: 100)

と言う事で探し回った先が最初のURLです。

で、私が使用するように書き直してみました。
起動バッチ.bat
*******************************************
rem データ以外のインポート
IMP USERID=TEST/TEST@xe FILE=aiueo.dmp LOG=aiueo-1 FULL=Y COMMIT=Y rows=N indexes=N >> inportLog.log
rem テーブルのchar型を正常値に変更
SQLPLUS TEST/TEST@xe @UPDATE_TABLE.SQL >> inportLog.log
rem 制約をOFFに設定
SQLPLUS TEST/TEST@xe @CONSTRAINT_DISABLE.SQL >> inportLog.log
rem データのインポート
IMP USERID=TEST/TEST@xe FILE=aiueo.dmp LOG=aiueo-2 FULL=Y COMMIT=Y ignore=Y >> inportLog.log
rem 制約をONに設定
SQLPLUS TEST/TEST@xe @CONSTRAINT_ENABLE.SQL >> inportLog.log
PAUSE
*******************************************

UPDATE_TABLE.SQL
*******************************************

SET LINESIZE 2000;

SET SERVEROUTPUT ON;

DECLARE

ddl VARCHAR(2000);

BEGIN

FOR cur IN (

SELECT USER_TAB_COLUMNS.TABLE_NAME

, USER_TAB_COLUMNS.COLUMN_NAME

, USER_TAB_COLUMNS.DATA_TYPE

, USER_TAB_COLUMNS.DATA_LENGTH

FROM USER_TAB_COLUMNS, USER_TABLES

WHERE USER_TAB_COLUMNS.TABLE_NAME = USER_TABLES.TABLE_NAME

AND (USER_TAB_COLUMNS.DATA_TYPE = 'VARCHAR2' OR USER_TAB_COLUMNS.DATA_TYPE = 'CHAR')

) LOOP

ddl := 'ALTER TABLE ' || cur.TABLE_NAME || ' MODIFY (' || cur.COLUMN_NAME || ' ' || cur.DATA_TYPE || '(' || cur.DATA_LENGTH || ' CHAR))';

DBMS_OUTPUT.PUT_LINE(ddl);

EXECUTE IMMEDIATE ddl;

END LOOP;

END;

/

DECLARE

username VARCHAR(2000);

ddl VARCHAR(2000);

BEGIN

SELECT USER INTO username FROM DUAL;

FOR cur IN (

SELECT USER_TAB_STATISTICS.TABLE_NAME

FROM USER_TAB_STATISTICS

) LOOP

DBMS_OUTPUT.PUT_LINE(username || ' ' || cur.TABLE_NAME);

DBMS_STATS.UNLOCK_TABLE_STATS(username, cur.TABLE_NAME);

END LOOP;

END;

/

EXIT

/

*******************************************

CONSTRAINT_DISABLE.SQL
*******************************************

SET LINESIZE 2000;

SET SERVEROUTPUT ON;

DECLARE

ddl VARCHAR(2000);

BEGIN

FOR cur IN (

SELECT constraint_name,

constraint_type,

table_name,

status

FROM user_constraints

ORDER BY constraint_name

) LOOP

ddl := 'ALTER TABLE ' || cur.table_name || ' DISABLE CONSTRAINT ' || cur.constraint_name;

DBMS_OUTPUT.PUT_LINE(ddl);

EXECUTE IMMEDIATE ddl;

END LOOP;

END;

/

EXIT

/

*******************************************

CONSTRAINT_ENABLE.SQL
*******************************************

SET LINESIZE 2000;

SET SERVEROUTPUT ON;

DECLARE

ddl VARCHAR(2000);

BEGIN

FOR cur IN (

SELECT constraint_name,

constraint_type,

table_name,

status

FROM user_constraints

ORDER BY constraint_name DESC

) LOOP

ddl := 'ALTER TABLE ' || cur.table_name || ' ENABLE CONSTRAINT ' || cur.constraint_name;

DBMS_OUTPUT.PUT_LINE(ddl);

EXECUTE IMMEDIATE ddl;

END LOOP;

END;

/

EXIT

/

*******************************************

ここまで読む人はいないだろうけど、とりあえず説明
起動バッチ.bat
 → ダブルクリックで起動する奴です。
   この順番が重要です。

UPDATE_TABLE.SQL
 → URLに書いてある重要なSQL
   これを実行することで、INSERT時のエラーが無くなります。

CONSTRAINT_DISABLE.SQL
 → 制約をOFFにするSQL
   SQLの中の「ORDER BY」は書き直してください。
   私のシステムでは、この順番じゃないとすべてOFFに出来ませんでした。

CONSTRAINT_ENABLE.SQL
 → 制約をONにするSQL
   SQLの中の「ORDER BY」は書き直してください。
   順番は気にしなくてもONに出来ましたが、とりあえずつけてます。

検索ワード:Oracle インポート エクスポート imp exp バージョン違い エラー UTF-8 UTF8 SJIS ORA-12899 NLS_LANG 変更 やり方 方法 インポート出来ない SHIFT-JISからUTF-8の変更 サイズが増える

カテゴリー: 未分類   パーマリンク

コメントは受け付けていません。