asoka.hang's oracle/java blog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  4 随笔 :: 0 文章 :: 0 评论 :: 0 Trackbacks
case:在scott.emp中有一个字段为deptno用来存储部门编号,在关系型数据库中一个字段只能够存储一列值(像ENAME列只能够存储员工姓名的值),要想查询emp与dept两表间的关联值还得运用主从表间的关系,查询效率不高,在emp表中deptno字段并不是很复杂(因为dept表中仅三个字段)的情况下,oracle允许在emp表中的deptno字段里存储一个表,这虽然违反关系型数据库的规则,但是提高了性能。

我们将举一个入库明细的例子来说明可变数组在上面类似情况的应用。

创建一个入库的明细类型mingxitype:
SQL >   create   or   replace  type mingxitype  as  object
  
2
  (
  
3      goodsid  varchar ( 15
),
  
4      incount  int
,
  
5      providerid  varchar ( 10
)
  
6
  );
  
7    /

创建一个基于mingxitype类型的可变数组:
SQL >   create   or   replace  type arrmingxitype  as  varray( 100 of  mingxitype;
  
2    /

创建一个产品入库主表:
SQL >   create   table  instock
  
2
  (
  
3      orderid  int   primary   key
,
  
4
     indate date,
  
5
     mingxi arrmingxitype
  
6   );

向主表中插入数据:
SQL >   insert   into  instock  values ( 1001 ,to_date( ' 2006-1-1 ' , ' YYYY-MM-DD ' ),arrmingxitype
  
2   (mingxitype( ' 101 ' , 10 , ' S01 ' ),mingxitype( ' 102 ' , 30 , ' S05 ' )));

通过查询可以查出主表instock中的字段mingxi中其实包括了一张表的内容,因为显示出来的arrmingxitype可变数组内容比较零乱,降低了可读性,运用PL/SQL可以读出,但是这里我们用table()函数即可完成这个输出修改,SQL语句如下:
SQL >   select   *   from   table ( select  s.mingxi  from  instock s  where  orderid = 1001 );

GOODSID            INCOUNT PROVIDERID
-- ------------- ---------- ----------

101                       10  S01
102                       30  S05

这样,通过在表中插入一个可变数组就将文中case里的问题给解决了。

可变数组也有一定的缺陷,比如更新起来比较麻烦,因为不能更新varray中的单个元素,也就意味着,如果要去更新varray中的某个字段,需得将整个varray中的数据全部重新输入一次,所以,可变数组在应用过程中需得慎重选择,可以将其应用于一些平常不需要去修改数据的环境中,比如医院里医生开的处方归档资料库等case中。
posted on 2006-04-13 16:18 asoka的oracle/java博客 阅读(629) 评论(0)  编辑  收藏 所属分类: Oracle

只有注册用户登录后才能发表评论。


网站导航: