Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1706003
  • 博文数量: 136
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3261
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-22 11:26
文章分类

全部博文(136)

文章存档

2010年(1)

2009年(26)

2008年(109)

我的朋友

分类: Oracle

2008-05-27 10:09:08

与联合数组不同,嵌套表和 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 之间的交互方式也同样适用。不过二者在使用上还是有两点不同的,下次我们再介绍。

阅读(2752) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~