----------------index-by表------------------------
index-by表
定义——由与数组类似同质元素的集合组成的一种复合数据类型。
集合中的元素是稀疏分布的,没有限定的边界,只是由整数索引将其连接在一起。可以是整数、负整数。
1、定义和赋值
数字
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_num number:=13;
begin
v_example_tab(1):=1001;
v_example_tab(2):=1002;
v_example_tab(10):=1010;
v_example_tab(-10):=1011;
v_example_tab(0):=1000;
v_example_tab(v_num):=1013;
dbms_output.put_line(to_char(v_example_tab(1)));
dbms_output.put_line(to_char(v_example_tab(2)));
dbms_output.put_line(to_char(v_example_tab(10)));
dbms_output.put_line(to_char(v_example_tab(-10)));
dbms_output.put_line(to_char(v_example_tab(0)));
dbms_output.put_line(to_char(v_example_tab(v_num)));
end;
字符串的
declare
type num_table is table of varchar2(20) index by binary_integer;
v_example_tab num_table;
v_num number:=13;
begin
v_example_tab(1):='xxxx';
v_example_tab(2):='yyyy';
v_example_tab(10):='ooooo';
v_example_tab(-10):='99999';
dbms_output.put_line(v_example_tab(1));
dbms_output.put_line(v_example_tab(2));
dbms_output.put_line(v_example_tab(10));
dbms_output.put_line(v_example_tab(-10));
end;
记录
declare
type hrc_org_rec is record(hrc_code number,hrc_descr varchar2(20));
type num_table is table of hrc_org_rec index by binary_integer;
v_example_tab_x num_table;
v_num number:=13;
begin
v_example_tab_x(1).hrc_code:=1000;
v_example_tab_x(1).hrc_descr:='yyyy';
v_example_tab_x(2).hrc_code:=1001;
v_example_tab_x(2).hrc_descr:='99999';
dbms_output.put_line(to_char(v_example_tab_x(1).hrc_code));
dbms_output.put_line(v_example_tab_x(1).hrc_descr);
dbms_output.put_line(to_char(v_example_tab_x(2).hrc_code));
dbms_output.put_line(v_example_tab_x(2).hrc_descr);
end;
2、index-by的聚集赋值方法
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_example_tab1 num_table;
v_num number:=13;
begin
v_example_tab(1):=1001;
v_example_tab(2):=1002;
v_example_tab(10):=1010;
v_example_tab(-10):=1011;
v_example_tab(0):=1000;
v_example_tab(v_num):=1013;
v_example_tab1:=v_example_tab; --聚集赋值
dbms_output.put_line(to_char(v_example_tab1(1)));
dbms_output.put_line(to_char(v_example_tab1(2)));
dbms_output.put_line(to_char(v_example_tab1(10)));
dbms_output.put_line(to_char(v_example_tab1(-10)));
dbms_output.put_line(to_char(v_example_tab1(0)));
dbms_output.put_line(to_char(v_example_tab1(v_num)));
end;
3、访问未定义的行
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_example_tab1 num_table;
v_num number:=13;
begin
v_example_tab(1):=1001;
v_example_tab(2):=1002;
v_example_tab(10):=1010;
v_example_tab(-10):=1011;
v_example_tab(0):=1000;
v_example_tab(v_num):=1013;
v_example_tab1:=v_example_tab;
dbms_output.put_line(to_char(v_example_tab1(1))); --输出正常
dbms_output.put_line(to_char(v_example_tab1(2))); --输出正常
dbms_output.put_line(to_char(v_example_tab1(5))); --报错,数据找不到
dbms_output.put_line(to_char(v_example_tab1(10))); --后面的不再输出,程序中断
dbms_output.put_line(to_char(v_example_tab1(-10)));
dbms_output.put_line(to_char(v_example_tab1(0)));
dbms_output.put_line(to_char(v_example_tab1(v_num)));
end;
4、通过赋值元素来创建index-by的行
declare
type num_table is table of varchar2(20) index by binary_integer;
v_example_tab num_table;
begin
for idx in 1..10 loop
v_example_tab(idx):=(2*idx)+1;
end loop;
for idx in 1..10 loop
dbms_output.put_line(to_char(v_example_tab(idx)));
end loop;
end;
5、删除index-by的内容
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_example_tab1 num_table;
v_num number:=13;
begin
v_example_tab(1):=1001;
v_example_tab(2):=1002;
v_example_tab(10):=1010;
v_example_tab(-10):=1011;
v_example_tab(0):=1000;
v_example_tab(v_num):=1013;
v_example_tab:=v_example_tab1; --用空的index-by赋值相当于删除
dbms_output.put_line(to_char(v_example_tab(1)));
dbms_output.put_line(to_char(v_example_tab(2)));
dbms_output.put_line(to_char(v_example_tab(10)));
dbms_output.put_line(to_char(v_example_tab(-10)));
dbms_output.put_line(to_char(v_example_tab(0)));
dbms_output.put_line(to_char(v_example_tab(v_num)));
end;
6、index-by的方法
===A exists方法——判断元素是否存在
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_num number:=13;
begin
v_example_tab(1):=1001;
v_example_tab(2):=1002;
v_example_tab(10):=1010;
v_example_tab(-10):=1011;
v_example_tab(0):=1000;
v_example_tab(v_num):=1013;
if v_example_tab.exists(-10) then
dbms_output.put_line('YES');
else
dbms_output.put_line('NO');
end if;
end;
===B count方法——取index-by的元素个数,就是计算已经定义的index-by行(索引、下标)的个数
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_num number:=0;
begin
for idx in 1..10 loop
v_example_tab(idx):=(2*idx)+1;
end loop;
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
for idx in 1..10 loop
dbms_output.put_line(to_char(v_example_tab(idx)));
end loop;
end;
===C delete——删除元素
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_num number:=0;
begin
for idx in 1..10 loop
v_example_tab(idx):=(2*idx)+1;
end loop;
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
v_example_tab.delete(1);
v_example_tab.delete(3);
v_example_tab.delete(7);
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
end;
---------------------------------
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_num number:=0;
begin
for idx in 1..10 loop
v_example_tab(idx):=(2*idx)+1;
end loop;
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
v_example_tab.delete(1);
v_example_tab.delete(3);
v_example_tab.delete(7);
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
for idx in 1..v_num loop
if v_example_tab.exists(idx) then
dbms_output.put_line(to_char(v_example_tab(idx)));
else
dbms_output.put_line('NULL!');
end if;
end loop;
end;
输出:
10
7
NULL!
5
NULL!
9
11
13
NULL!
8~10个元素是没有输出的。
===E first、last、next====
first——取index-by表第一个不为null的元素
last——取index-by表最后一个不为null的元素
next——取index-by表下一个不为null的元素
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_num number:=0;
begin
for idx in 1..10 loop
v_example_tab(idx):=(2*idx)+1;
end loop;
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
v_example_tab.delete(1);
v_example_tab.delete(3);
v_example_tab.delete(7);
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
for idx in v_example_tab.first..v_example_tab.last loop
if v_example_tab.exists(idx) then
dbms_output.put_line(to_char(v_example_tab(idx)));
else
dbms_output.put_line('NULL!');
end if;
end loop;
end;
====或者只输出不为null的元素=====
declare
type num_table is table of number index by binary_integer;
v_example_tab num_table;
v_num number:=0;
idx integer;
begin
for idx in 1..10 loop
v_example_tab(idx):=(2*idx)+1;
end loop;
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
v_example_tab.delete(1);
v_example_tab.delete(3);
v_example_tab.delete(7);
v_num:=v_example_tab.count;
dbms_output.put_line(to_char(v_num));
idx:=v_example_tab.first; ---为5
loop
if v_example_tab.exists(idx) then
dbms_output.put_line(to_char(v_example_tab(idx)));
end if;
exit when idx=v_example_tab.last; --当到最后一个时退出
idx:=v_example_tab.next(idx);
end loop;
end;
7、引用记录的index-by表
==A 分散赋值
declare
type hrc_org_rec is record(hrc_org_id number,hrc_descr varchar2(20),org_short_name varchar2(30));
type num_table is table of hrc_org_rec index by binary_integer;
v_example_tab num_table;
cursor csr_hrc_org is select hrc_org_seq.nextval hrc_org_id,h.hrc_descr,o.org_short_name
from org_tab o,hrc_tab h
where o.hrc_code=h.hrc_code;
i integer:=1;
begin
for idx in csr_hrc_org loop
v_example_tab(i).hrc_org_id:=idx.hrc_org_id;
v_example_tab(i).hrc_descr:=idx.hrc_descr;
v_example_tab(i).org_short_name:=idx.org_short_name;
i:=i+1;
end loop;
for j in 1..v_example_tab.count loop
if v_example_tab.exists(j) then
dbms_output.put_line(to_char(v_example_tab(j).hrc_org_id));
dbms_output.put_line(v_example_tab(j).hrc_descr);
dbms_output.put_line(v_example_tab(j).org_short_name);
end if;
end loop;
end;
==B 聚集赋值
declare
type hrc_org_rec is record(hrc_org_id number,hrc_descr varchar2(20),org_short_name varchar2(30));
type num_table is table of hrc_org_rec index by binary_integer;
v_example_tab num_table;
cursor csr_hrc_org is select hrc_org_seq.nextval hrc_org_id,h.hrc_descr,o.org_short_name
from org_tab o,hrc_tab h
where o.hrc_code=h.hrc_code;
i integer:=1;
begin
for idx in csr_hrc_org loop
v_example_tab(i):=idx;--把游标句柄赋给index-by,
等于把游标字段的每个属性值赋给了index-by基于记录的每个字段的属性
i:=i+1;
end loop;
for j in 1..v_example_tab.count loop
if v_example_tab.exists(j) then
dbms_output.put_line(to_char(v_example_tab(j).hrc_org_id));
dbms_output.put_line(v_example_tab(j).hrc_descr);
dbms_output.put_line(v_example_tab(j).org_short_name);
end if;
end loop;
end;
练习:将员工的姓名、薪资、职位、部门名称用记录的方式存储在index-by中,然后输出这个index-by。
-------------------------------
declare
type rc is record(rc_ename varchar2(10),rc_sal number(7,2),rc_job varchar(9),rc_dname varchar(14));
type rc_index is table of rc index by binary_integer;
v_exp rc_index;
i integer:=1;
begin
for idx in (select a.ename,a.sal,a.job,b.dname from emp a,dept b
where a.deptno=b.deptno) --这里为隐式游标
loop
v_exp(i):=idx;
i:=i+1;
end loop;
for j in 1..v_exp.count loop
if v_exp.exists(j) then
dbms_output.put_line(to_char(v_exp(j).rc_ename));
dbms_output.put_line(to_char(v_exp(j).rc_sal));
dbms_output.put_line(to_char(v_exp(j).rc_job));
dbms_output.put_line(to_char(v_exp(j).rc_dname));
end if;
end loop;
end;
-----------------------------------------------------