博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

CLEANER

总觉得时间不够用,原来是自己把时间分散了。
   yuechaotian.cublog.cn
关于作者  
name:yuechaotian
employment:coder
age:25
from:NEU
about me:a retardate
email:yuechaotian(at)gmail.com
msn:yuechaotian(at)hotmail.com

我的分类  




PL/SQL collection(6)— 嵌套表与 VARRAY 数组
与联合数组不同,嵌套表和 VARRAY 数组可以在 PL/SQL 块中定义,也可以在数据库级进行定义。在数据库级定义后,它们可以用来做 Object 的属性类型,或者列的定义类型。而且,嵌套表和 VARRAY 数组在使用前必须初始化,就像我们先前看到的那样。否则,会出现下面的错误:

 

ORA-06531: Reference to uninitialized collection

 

当然,也可以在初始化的时候,就给它们赋初值,而这时不需要显示扩展(EXTEND)空间。我们用嵌套表举例:

 

SQL> set serveroutput on

SQL> declare

  2    type tnt_colors is table of varchar2(10);

  3    nt_myColor tnt_colors := tnt_colors();

  4    nt_hisColor tnt_colors := tnt_colors('White', 'Black');

  5    nt_herColor tnt_colors := tnt_colors('Red');

  6  begin

  7    dbms_output.put_line( 'COUNT(myColor): ' || nt_myColor.count );

  8    dbms_output.put_line( 'COUNT(hisColor): ' || nt_hisColor.count );

  9    dbms_output.put_line( 'COUNT(herColor): ' || nt_herColor.count );

 10  end;

 11  /

COUNT(myColor): 0

COUNT(hisColor): 2

COUNT(herColor): 1

 

PL/SQL 过程已成功完成。

 

SQL>

 

 由同一集合类型定义的变量之间,也可以相互直接赋值,此时是把实际的值赋予对方,而不是指针:

 

SQL> declare

  2    type tnt_colors is table of varchar2(10);

  3    nt_myColor tnt_colors := tnt_colors();

  4    nt_hisColor tnt_colors := tnt_colors('White', 'Black');

  5  begin

  6    nt_myColor := nt_hisColor;

  7    dbms_output.put_line( 'COUNT(myColor): ' || nt_myColor.count );

  8    dbms_output.put_line( 'myColor(1): ' || nt_myColor(1) );

  9    dbms_output.put_line( 'myColor(2): ' || nt_myColor(2) );

 10    nt_myColor(2) := 'Yellow';

 11    dbms_output.put_line( 'After change, myColor(2): ' || nt_myColor(2) );

 12    dbms_output.put_line( 'After change, hisColor(2): ' || nt_hisColor(2) );

 13* end;

SQL> /

COUNT(myColor): 2

myColor(1): White

myColor(2): Black

After change, myColor(2): Yellow

After change, hisColor(2): Black

 

PL/SQL 过程已成功完成。

 

SQL>

 

请记住,相互直接赋值的前提是:这两个变量是由同一集合类型定义的。除此以外,还可以将表中获取的数据直接 FETCH 到集合变量中赋值,就像下面的例子中的:

 

SQL> create type tnt_colors is table of varchar2(20);

  2  /

 

类型已创建。

 

SQL> create table color(

  2    model_type varchar2(12),

  3    colors tnt_colors

  4  )nested table colors store as str_color_colors;

 

表已创建。

 

SQL> insert into color values('RGB', tnt_colors('White', 'Black', 'Red'));

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> declare

  2    nt_colors tnt_colors;

  3  begin

  4    select colors

  5      into nt_colors

  6      from color

  7     where model_type = 'RGB';

  8    for n_pointer in nt_colors.first..nt_colors.last loop

  9      dbms_output.put_line( n_pointer || ': ' || nt_colors(n_pointer) );

 10    end loop;

 11    -- insert a new row
 12    nt_colors(1) := 'noColor';
 13    insert into color values('newRow', nt_colors);
 14    commit;
 15  end;

 16  /

1: White

2: Black

3: Red

 

PL/SQL 过程已成功完成。

 

SQL>

 

我们看,在11-14行,修改了嵌套表 nt_colors 中的第1个元素后,又插入了一条新记录。Oracle 给我们提供了非常灵活的集合与表交互的方法。我们看看此时表 color 中的数据:

 

SQL> select * from color;

 

MODEL_TYPE

------------

COLORS

--------------------------------------

RGB

TNT_COLORS('White', 'Black', 'Red')

 

newRow

TNT_COLORS('noColor', 'Black', 'Red')

 

以上我们是以嵌套表举例,对于 VARRAY 数组,以上数据库与 PL/SQL 之间的交互方式也同样适用。不过二者在使用上还是有两点不同的,下次我们再介绍。

 发表于: 2008-05-27,修改于: 2008-05-27 10:09 已浏览455次,有评论0条 推荐 投诉

  网友评论

  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.72211

京ICP证041476号