Type是我們經常使用的數據庫對象結構。我們在實際中,可以單獨定義type類型,之后在PL/SQL代碼或者數據表中使用。
在一個偶然的機會讓筆者發現使用Type類型在數據exp/imp中的麻煩。當我們使用exp/imp工具進行同數據庫實例(Instance)不同Schema之間數據拷貝時,如果Schema中有type類型,就會出現問題錯誤。
如下:
IMP-00003: 遇到 ORACLE 錯誤 2304 ORA-02304: 無效的對象標識符文字 IMP-00017: 由於 ORACLE 錯誤 2304, 以下語句失敗: "CREATE TYPE "T_REC_TABLE" TIMESTAMP '2010-12-21:18:17:33' OID 'D9AFD3FAE0A5" "4964B1684CA28C69CEED' as table of t_rec_test;" "" "" IMP-00003: 遇到 ORACLE 錯誤 2304 ORA-02304: 無效的對象標識符文字 IMP-00017: 由於 ORACLE 錯誤 2304, 以下語句失敗: "CREATE TYPE "T_TYP" TIMESTAMP '2012-03-07:10:47:03' OID '8E294AB7CC28493A94" "FF82791A376379' as object (id number);" "" ""
對於create type失敗,可在導入命令中末尾加上 transform=OID:N
可以參考下面的說明。
大意就是說如果TRANSFORM參數設置成OID=N,表示在imp的時候,新創建的表或這個類型會賦予新的OID,而不是dmp文件中包含的OID的值。但是這個參數的默認值是OID=Y,因此在進行Imp的時候,新創建的表或者type會賦予同樣的OID,如果是位於同一個數據庫上的不同schema,那就會造成OID沖突的問題,因此解決這個問題也很簡單,只需要在impdp的時候,顯示設置transform 參數為OID=N既可以了。如下所示,
(cmd> impdp test/test directory=dump_dir dumpfile=dump.dmp logfile=dump.log remap_schema=frank:test transform=OID:N)
參考地址:http://www.shangxueba.com/jingyan/View.aspx?id=52990
http://blog.itpub.net/17203031/viewspace-732089/
感謝