天天看點

oracle+imp部分資料,ORACLE資料庫IMP邏輯導入出現ORA-00910的處理案例

ORACLE IMP ORA-00910 出錯處理案例

環境 源庫AIX+9.2.0.4  新庫solaris+9.2.0.8

導入出錯提示是以下部分:

IMP-00017: following statement failed with ORACLE error 910:

"CREATE TABLE "T_CSL_DYNAITEMDATAENTRY" ("FID" VARCHAR2(44) NOT NULL ENABLE,"

" "FITEMDATAID" VARCHAR2(44) NOT NULL ENABLE, "FITEMID" VARCHAR2(44) NOT NUL"

"L ENABLE, "FKEYNUMBER" NVARCHAR2(500) NOT NULL ENABLE, "FKEYNAME" NVARCHAR2"

"(500) NOT NULL ENABLE, "FDATAELEMENT" NUMBER(10, 0) NOT NULL ENABLE, "FVALU"

"ETYPE" NUMBER(10, 0) NOT NULL ENABLE, "FYEAR" NUMBER(10, 0) NOT NULL ENABLE"

", "FPERIOD" NUMBER(10, 0) NOT NULL ENABLE, "FVALUE" NUMBER(21, 6), "FDYNAIT"

"EMTYPE" NUMBER(10, 0), "FTEXTVALUE" NVARCHAR2(4000), "FGRADENUMBER" VARCHAR"

"2(80))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 15728"

"640 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "EAS_D_CH"

"INAMOBILE_STANDARD" LOGGING NOCOMPRESS"

IMP-00003: ORACLE error 910 encountered

ORA-00910: specified length too long for its datatype

經過詳細檢查導入日志隻有要NVARCHAR2(4000)的字段類型表都導入不了,而且nvarchar2存儲的資料大部分是中文。

在原庫查詢

SQL> select name,VALUE$ from props$ where name in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

NAME                           VALUE$

------------------------------ --------------------------------------------------------------------------------

NLS_CHARACTERSET               ZHS16GBK

NLS_NCHAR_CHARACTERSET         UTF8

在新庫查詢

SQL> select name,VALUE$ from props$ where name in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

NAME                           VALUE$

------------------------------ --------------------------------------------------------------------------------

NLS_CHARACTERSET               ZHS16GBK

NLS_NCHAR_CHARACTERSET         AL16UTF16

可以看出原庫和新庫的國家字元集不同

通過查資料,得到以下答案

在建立資料庫時,我們可以指定字元集(CHARACTER SET)和國家字元集(NATIONAL CHARACTER SET)。

字元集用來存儲:

CHAR, VARCHAR2, CLOB, LONG等類型資料

用來标示諸如表名、列名以及PL/SQL變量等

SQL和PL/SQL程式單元等

國家字元集用以存儲:

NCHAR, NVARCHAR2, NCLOB等類型資料

utf-8和utf-16他們兩的字元範圍是完全相同的。

utf-8和utf-16是unicode的兩種編碼實作,都能完全表現unicode。

不同之處就在于:

utf8 對于ansi 字元 (英文字母,數字,符号) 用一個 byte ,但對中文字元就要 3個byte才行,甚至有要4個byte的漢字。

而一般 utf16 對 一般的 字元包括漢字都是2bytes。

是以原來存儲的字段值更大,而新庫存儲的字段值更小,導緻nvarchar2類型的資料導入出錯。

解決方法:

1.更改國家字元集由AL16UTF16為UTF8

$ sqlplus ‘/ as sysdba’

SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP MOUNT EXCLUSIVE;

SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;

SQL> ALTER DATABASE OPEN;

SQL> ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;

SQL> SHUTDOWN IMMED

用這種方法更改後,通過測試導入一個有nvarchar2字段類型表的資料,會出現亂碼,而且直接這樣修改國家字元集會存在風險,是以放棄。

2.重建資料庫,選擇國家字元集為UTF8,測試導入一個有nvarchar2字段類型表的資料正常。