ORA-2304:不同表空间不同用户的Type及Clob导入问题

 今天有同事导入数据库时,当create type时候报错,我在原有数据库A(同一数据库下建立多个用户)测试很多遍都出现这个问题。新创建数据B导入没有问题。

查看ora-02304错误原因如下:

ORA-02304:

invalid object identifier literal
Cause: An attempt was made to enter an object identifier literal for CREATE TYPE that is either:

- not a string of 32 hexadecimal characters

- an object identifier that already identifies an existing object

- an object identifier different from the original object identifier already assigned to the type


Action: Do not specify the object identifier clause or specify a 32 hexadecimal-character object identifier literal that is unique or identical to the originally assigned object identifier. Then retry the operation.


       但是我数据库A中建立新用户,不可能出现重复的type数据类型啊,很难解释。在网上找到解决的详细资料,在此发出来做一个备份,并且学习高手分析问题的能力。


     本文出处:http://www.cnblogs.com/fangwenyu/archive/2010/07/02/1769667.html    在此非常感谢作者。

    在尝试用impdp把一个dump文件从一个schema导入到另外一个schema (两个schema位于同一个数据库上,需要用到remap_schema参数来进行schema的映射转换)遇到了诸多类似如下的错误....

(cmd> impdp test/test directory=dump_dir dumpfile=dump.dmp logfile=dump.log remap_schema=frank:test) 

 


ORA - 39083 : Object type TYPE failed  to   create   with  error:
ORA - 02304 invalid object identifier literal
Failing sql  is :
CREATE  TYPE "TEST"."BV_MULTI_VALUE_ROW"    OID  ' 60D2BBFD90E04FABBFEE0C45D303F003 '   AS  OBJECT (
    VALUE  varchar2 ( 512 ),
    DESCRIPTION  VARCHAR2 ( 1000 )
    ); 

 

 

注意到在创建type的时候,“多出来”一段OID的东东,很是奇怪,因为平时在创建一个type的时候,根本就不会涉及到指定OID的问题, 问题八成就是出在这个OID上。那么这个OID到底是什么呢?为什么会导致ORA-02304的错误呢?

 

OID应该就是Object Identifier, 在数据库中每个object都有自己唯一的标识,也就是object id. 因此把一个Object从一个schema导入到另外一个schema的时候(在同一个数据库上),如果这个OID也保持不变的话,那么就会出现多个Object共享同一个object id的问题,这显然是不行的。因此会出现这个invalid object identifier的问题。

 

那么如何解决这个问题呢? 通过impdp help=y 可以看到有一个参数来解决这个问题,

 

TRANSFORM             Metadata transform  to  apply  to  applicable objects.
                      Valid transform keywords: SEGMENT_ATTRIBUTES, STORAGE
                      
OID and  PCTSPACE.

 

 

 看看帮助文档,得到如下信息,

 

OID - If the value is specified as n, the assignment of the exported OID during the 

creation of object tables and types is inhibited. Instead, a new OID is assigned. 

This can be useful for cloning schemas, but does not affect referenced objects. The 

default value is y.


 

大意就是说如果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


另一种解决方案:

经搜索并测试:

1.Clob不同表空间导入 
==>有clob字段的表不能改表空间. 只有自已先建好表(建时指定表空间),然后再imp. 表多的话,用工具来生成建表语句(e.g.: pl/sql developer)


2.Type不同用户导入 
有type的,也是要自已运行代码创建的.


总结:如果exp时有clob或自定的type,需要自已先在目标schema下建好表,之后再imp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值