日期:2014-05-17  浏览次数:20960 次

导入导出的又一个尖端问题imp 00058 ora 00942 table or view does not exist
本人测试机环境11.2.0.0
首先描述一下,大概描述一下。使用了Oracle oop 和 lob ,派生类里面包含lob大对象(存储的是一些图像信息),导出正常,导入的时候发生错误imp 00058 ora 00942 table or view does not exist 。下面是测试过程:
1. 创建基类
CREATE OR REPLACE TYPE "METADATA_BASE" AS OBJECT ( DSID VARCHAR2(40 CHAR)) not final ;
2. 创建派生类
CREATE OR REPLACE TYPE "META_TEMP_TYP_1446" UNDER METADATA_BASE ( SJKYHMM VARCHAR2(100 char),blobs blob) NOT FINAL ;
3. 建表
create table FILE_METADATA of METADATA_BASE ;
4. 初始化数据(直接使用网页形式的大对象了)
declare
image BLOB ;
begin
  image:=httpuritype('www.baidu.com').getblob;
  for i in 1.. 400 loop
  insert into file_metadata
  values
  (new meta_temp_typ_1446(i,i,image));
  end loop ;
  commit ;
end ;

5. 查看已有数据(用工具比如plsql developer可以查看blob 里面的具体内容)
select treat(value(t) as meta_temp_typ_1446) from file_metadata t ;

6. 导出
exp dexter/xiaojun tables=file_metadata file=d:\dex\blob\exp_blobs1.dmp log=d:\dex\blob\exp_blobs1.log
7. 删除已有数据(类型、表)
7.1 删除表
drop table file_metadata purge ;
7.2 删除类
drop type meta_temp_typ_1446 ;


drop type metadata_base ;
8. 导入
imp dexter/xiaojun tables=file_metadata file=d:\dex\blob\blobs1.dmp log=d:\dex\blob\imp_blobs1.log
C:\Users\dex>imp dexter/xiaojun tables=file_metadata file=d:\dex\blob\exp_blobs1.dmp log=d:\dex\blob\imp_blobs1.log
Import: Release 11.2.0.1.0 - Production on Sun Apr 15 16:15:40 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export file created by EXPORT:V11.02.00 via conventional path
import done in AL32UTF8 character set and AL16UTF16 NCHAR character set
import server uses ZHS16GBK character set (possible charset conversion)
. importing DEXTER's objects into DEXTER
. importing DEXTER's objects into DEXTER
. . importing table "FILE_METADATA"
IMP-00058: ORACLE error 942 encountered
ORA-00942: table or view does not exist
Import terminated successfully with warnings.
没有任何行返回,但是可以看到,表和类的metadata都已经导进数据库了,希望大家帮忙看一下,不胜感激。(经测试在派生类中不包含大对象的情况下,导入导出是正常的,只有当派生类里面包含lob字段的时候,才会发生这种问题)
select treat(value(t) as meta_temp_typ_1446) from file_metadata t ;



附一个查看lob segment 的脚本
SELECT b.table_name,a.owner,a.tablespace_name,a.SEGMENT_NAME,A.SEGMENT_TYPE,A.TABLESPACE_NAME,TO_CHAR(A.BYTES/(1024*1024),'999G999D999') AS MB
FROM DBA_SEGMENTS A,DBA_LOBS B
WHERE A.OWNER='&owner'
AND B.TABLE_NAME='FILE_METADATA'
AND (A.SEGMENT_NAME=B.SEGMENT_NAME OR A.SEGMENT_NAME=B.INDEX_NAME)
AND A.OWNER=B.OWNER
ORDER BY SEGMENT_NAME;

因为在定义子类型的时候使用的默认lob存储选项 也就是 in row ,所以当lob 字段存储的数据量太小时,不会另外创建segment,而是放在表的segment中。原文:
ENABLE STORAGE IN ROW If you enable storage in row, then the LOB value is stored in the row (inline) if its length is less than approximately 4000 bytes minus system control information. This is the default.




经测试,当lob字段中的数据小于4000byte,也就是LOB value is stored in the row (inline)的时候,导入导出正常,更加断定了我的猜想,是因为stored not in the row 的时候,数据行里面存放的是指向lob segment中的指针(lob定位符)。导入导出的时候,可能是因为指针无法定位lob数据,所以才发生错误,当然这只是我的猜想。附一个初始化lob数据的匿名块,有空的朋友可以帮忙测试下。公司的support帐号到期了,如果有人能够发service request……

declare
  v_blob BLOB;
  amount BINARY_INTEGER;
  offset INTEGER;
  v_char VARCHAR2(1000);
Begin
  for i in 1 .. 400 loop
  insert into file_metadata
  values
  (new meta_temp_typ_