pl/sql 集合是存放同種類型數據的集合,集合類型有三種,索引表、嵌套表、變長數組。python
集合的屬性和方法:sql
1.索引表數據庫
索引表其實至關於python中的簡單字典,只是索引表的索引是隱藏的。它的索引值能夠是字符串也能夠是數字類型。數組
索引表的使用:oop
type 類型名 is table of 數據類型 index by 索引數據類型;spa
變量名 類型名;code
例: blog
declare type ind is table of varchar2(20) index by pls_integer; v ind; begin --賦值 v(1):= 'a'; v(2):= 'b'; v(3):= 'c'; --輸出 for i in v.first..v.last loop --若是是loop或者是while循環,則能夠用到 next(i) 和 prior(i) dbms_output.put_line(v(i)); -- i:=v.next(i) 下面給出例子 end loop; dbms_output.put_line(v.count); end;
上述例子擴展 declare type ind is table of VARCHAR2(20) index by pls_integer; v ind; i INT(2):=1; --定義 begin --賦值 v(1):= 'a'; v(2):= 'b'; v(3):= 'c'; --輸出 LOOP dbms_output.put_line(v(i)); EXIT WHEN i=v.last; i:=v.NEXT(i); end loop; dbms_output.put_line(v.count); end;
2.嵌套表索引
嵌套表不須要聲明索引的類型,它只能用整型,因此默認。內存
定義:
type 類型名 is table of 數據類型;
變量名 類型名;
使用嵌套表時,須要初始化和擴展;
declare type ind is table of varchar2(10); v ind; begin v:=ind('a','b','c'); ---初始化同時能夠賦初始值 v.extend(3); --沒對擴展的內存賦值時,這些值就是空的 for i in v.first..v.last loop dbms_output.put_line(v(i)); end loop; end; 結果是 a b c
--後面都是空值,固然擴展的時候能夠隨意賦值現有的,或者循環賦值
--如今的總長度爲初始的長+擴展的長度
3.變長數組
定義:
type 類型名 is varray(默認長度) of 數據類型;
變量名 類型名;
declare type var is varray(30) of varchar2(10); v var; n number(2):=65; BEGIN v:=var(); ---初始化 v.extend(10); ---擴展的長度不能超過定義的默認長度 for i in 1..10 loop --循環賦值的最大值也不能超多初始化的長度 v(i):=CHR(n); n:=n+1; END loop; for j in v.first ..v.last loop dbms_output.put_line(v(j)); end loop; end;
4.嵌套表變量的使用(索引表不能在數據庫中使用)
create type 類型 is table of 數據類型;
create type tab1 is table of varchar2(10); declare v tab1; begin --初始化 v:=tab1('a','b','c'); for i in v.first..v.last loop dbms_output.put_line(v(i)); end loop; end;
create table 表名(
變量名 類型 約束,
...
嵌套表變量 嵌套表類型
)nested table 嵌套表名 store as 數據庫中沒有的表名;
例:
create table tab( id number(11) primary key, create_time date, namelist tabType )nested table namelist store as names; insert into tab(id,create_time,namelist) values(1,sysdate,tabType('smith','john','lucy')); insert into tab(id,create_time,namelist) values(2,sysdate,tabType('smith','john','lucy')); select * from tab; select * from table(select namelist from tab where id=1);--子查詢只能有一條結果
5.變長數組在數據庫的使用
create type 類型名 is varray(默認長度) of 存儲的數據的數據類型; create type arrtype is varray(10) of varchar2(30); 變長數組類型在數據庫中的使用和普通類型同樣 create table arr( id number(11) primary key, create_time date, namelist arrtype ); insert into arr(id,create_time,namelist) values(1,sysdate,arrtype('張三','李四','王五')); select * from arr; select * from table(select namelist from arr where id=1);
6.bulk collect
select ... bulk collect into 集合變量; --能夠查出多條記錄,集合變量若是是嵌套表或者變長數組時(是不須要初始化的);
execute immediate select語句 bulk collect into 集合變量;
declare --聲名一個嵌套表類型 type ttype is table of varchar2(30); --聲名一個變量 tab ttype; job ttype; begin --根據輸入的部門編號,查出部門下全部員工的姓名和工做 select ename,job bulk collect into tab,job from emp where deptno=&deptno; --遍歷集合打印 for i in tab.first..tab.last loop dbms_output.put_line(tab(i)||','||job(i)); end loop; end;
7.forall 批量綁定
就是for 循環 沒有loop和end loop
declare type ttype is table of number(10); empno_list ttype; begin select empno bulk collect into empno_list from emp where deptno=&deptno; forall i in empno_list.first..empno_list.last delete from emp where empno=empno_list(i); end;