----------------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;

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