全部博文(136)
分类: Oracle
2008-05-27 10:09:08
ORA-06531: Reference to
uninitialized collection |
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 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') |