plsql基礎二之集合

pl/sql 集合是存放同種類型數據的集合,集合類型有三種,索引表、嵌套表、變長數組。python

 

集合的屬性和方法:sql

  • first:取集合第一個元素的下標
  • last:取集合最後一個元素的下標
  • count:取集合中存放的元素個數(實際存放數據的個數)
  • limit:取集合能存放的數據個數(集合的長度,用於變長數組,索引表和嵌套表是無限長度)
  • next(下標):取當前下標的下一個元素的下標
  • prior(下標):取當前下標的上一個元素的下標
  • extend(n,index):表示將集合擴展n個元素,index表示集合已有元素的下標,若是有第二個參數,表示擴展集合n個元素而且擴展後的對應值是index這個下標所對應的值
  • delete(n):刪除集合中的元素

1.索引表數據庫

索引表其實至關於python中的簡單字典,只是索引表的索引是隱藏的。它的索引值能夠是字符串也能夠是數字類型。數組

索引表的使用:oop

  1. 定義索引表

      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;
相關文章
相關標籤/搜索