概述
在数据库中是否使用type,一直是我和我们同事之间讨论的话题。Type类型的使用常见的是使用Oracle的嵌套表和可变数组。在我看来,使用type,可以在数据库设计上比传统的关系数据库更直观。例如,在嵌套表的一些说明:
嵌套表是表中之表。一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。在某种意义上,它是在一个表中存储一对多关系的一种方法。考查一个包含部门信息的表,在任何时间内每个部门会有很多项目正在实施。在一个严格的关系模型中,将需要建立两个独立的表department和project。
嵌套表允许在department表中存放关于项目的信息。勿需执行联合操作,就可以通过department表直接访问项目表中的记录。这种不经联合而直接选择数据的能力使得用户对数据访问更加容易。甚至在并没有定义方法来访问嵌套表的情况下,也能够很清楚地把部门和项目中的数据联系在一起。在严格的关系模型中,department和project两个表的联系需要通过外部关键字(外键)关系才能实现。(1)
举例如下(1):
假设有一个关于动物饲养员的表,希望其中具有他们饲养的动物的信息。用一个嵌套表,就可以在同一个表中存储饲养员和其饲养的全部动物的信息。
1、 创建类型animal_ty:此类型中,对于每个动物都包含有一个记录,记载了其品种、名称和出生日期信息。
SQL> CREATE TYPE animal_ty AS OBJECT (
2 breed varchar2(25),
3 name varchar2(25),
4 birthdate date);
5 /
Type created.
2、 创建animals_nt:此类型将用作一个嵌套表的基础类型。
SQL> CREATE TYPE animals_nt as table of animal_ty;
2 /
Type created.
3、 创建表breeder:饲养员的信息表SQL> create table breeder
2 (breedername varchar2(25),
3 animals animals_nt)
4 nested table animals store as animals_nt_tab;
Table created.
4、 向嵌套表中插入记录
SQL> insert into breeder
2 values('mary',animals_nt(animal_ty('dog','butch','31-MAR-97'),
3 animal_ty('dog','rover','31-MAR-97'),
4 animal_ty('dog','julio','31-MAR-97')));
1 row created.
SQL>
SQL> insert into breeder
2 values('jane',animals_nt(animal_ty('cat','an','31-MAR-97'),
3 animal_ty('cat','jame','31-MAR-97'),
4 animal_ty('cat','killer','31-MAR-97')));
1 row created.
SQL>
SQL> commit;
Commit complete.
5、 查询嵌套表
SQL> select name,birthdate from
2 table(select animals from breeder
3 where breedername='mary')
4 where breed='dog';
NAME BIRTHDATE
------------------------- ---------
butch 31-MAR-97
rover 31-MAR-97
julio 31-MAR-97
到目前为止,作为一个程序员,他要做的事情很简单,只要从表中取数据即可。真的很好用。不幸的是,DBA接到指令,把刚才这个schema下的东东导到另外一个schema下。初看起来,这个问题很简单,不就是import时的fromuser和touser吗?
那让我们看看下面会发生什么:
如何export就无需多说了,看看import时:
D:> import system/manager fromuser=(a) touser=(b) file=a.dmp
…
IMP-00015: following statement failed because the object already exists:
"CREATE TYPE "ANIMALS_NT" TIMESTAMP '2003-11-14:16:57:15' OID '9365817654474"
"84DA8B53E2D67CC3583' as table of animal_ty;"
IMP-00061: Warning: Object type "CHJ"."ANIMALS_NT" already exists with a different identifier
IMP-00015: following statement failed because the object already exists:
"CREATE TYPE "ANIMAL_TY" TIMESTAMP '2003-11-14:16:57:03' OID '25072B5C897B42"
"A8AD468CF680F164F7' AS OBJECT ("
""
"breed varchar2(25),"
""
"name varchar2(25),"
""
"birthdate date);"
IMP-00061: Warning: Object type "B"."ANIMAL_TY" already exists with a different identifier
IMP-00017: following statement failed with ORACLE error 2304:
IMP-00003: ORACLE error 2304 encountered
ORA-02304: invalid object identifier literal
…
那么如何解答这种在同一数据库下不同schema下的导出导入呢。
Metalink 是这样给出方法值得看顺眼的有:
把前面的用户,上例中的用户A drop掉(够狠)。
在imp时,首先加参数show=y,得到log文件中修改这些DDL,把type中定义的OID删掉,执行修改的SQL(还行,不过我一向讨厌修改imp的这种文件,感觉乱乱的,到处是引号。而且如果导的类型多了,有的辛苦了。)
那么TOM怎么说:
“谁要你这么设计数据库?应该把type类型的定义放到一个公共的schema下。”那怎么解决,TOM也没说。
我求助第三方工具,PL/SQL Developer,在生成nested table的DDL有些问题,SQL Navagatior 不支持某个用户的所有object的DDL生成。
好在我用的是9i,我可以用DBMS_METADATA写个过程,如果8i呢?
不知道大家还有什么好建议。
参考文献:
1 http://www.fanqiang.com/a2/b2/20020426/080200201.html 嵌套表和可变数组
2.http://asktom.oracle.com/pls/ask ... ERIA:4540782494895,
3.http://asktom.oracle.com/pls/ask ... ERIA:1323002416801,
最后
以上就是高兴睫毛膏为你收集整理的oracle导出type,Oracle中使用Type类型后的imp/exp的全部内容,希望文章能够帮你解决oracle导出type,Oracle中使用Type类型后的imp/exp所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复