/*
loop
*/declare-- 定义嵌套表类型type mytable istableof varchar2(20);-- 声明变量
v1 mytable;-- 声明变量 下标
n number;begin
v1:=mytable('a','b','c');
n:=v1.first;loop
dbms_output.put_line(n);exitwhen n=v1.last;
n:=v1.next(n);endloop;end;/*
while
*/declare-- 定义嵌套表类型type mytable istableof varchar2(20);-- 声明变量
v mytable;
n number;begin
v:=mytable('a','b','c');
n:=v.first;while n<=v.lastloop
dbms_output.put_line(v(n));
n:=v.next(n);endloop;end;/*
for 因为他的下边是连续的
*/declare-- 定义嵌套表类型type mytable istableof varchar2(20);-- 声明变量
v1 mytable;begin
v1:=mytable('a','b','c');for n in v1.first..v1.lastloop
dbms_output.put_line(n);endloop;end;
嵌套表在数据库中的使用
-- 格式createtype 类型名称 istableof 数据类型;createtype mytable istableof varchar2(20);declare-- 声明变量 mytable是一个嵌套表类型(已经在我们数据库中)
v mytable;begin
v:=mytable('a','abc','b');for n in v.first..v.lastloop
dbms_output.put_line(n);endloop;end;/*
创建表的时候也可以使用嵌套表类型
create table 表名(
列 数据类型,
嵌套表列 嵌套表类型
)nested table 嵌套表类型列名 store as 表名(是数据库中没有的表);
*/-- 创建createtable a(
id number,
namelist mytable
)nested table namelist store as myname;-- 存值insertinto a(id,namelist)values(1,mytable('tom','jack','jerrt'));-- 查询select*from a;-- 查询嵌套表中的数据select*fromtable(select namelist from a where id =1);-- 删除时要注意,先删除表在删除类型droptable a;droptype mytable;
变长数组
/*
使用整数(只能为正)(pls_integer,binary_integer)作为下标,下标也是连续的;
元素个数有限制的,可以使用在plsql中也可以存储在数据库中。
和嵌套表一样,使用前呢需要初始化
*/-- 格式type 类型名称 is varray(长度)|varying array(长度)of 数据类型(保存的数据的数据类型);declare-- 声明变长数组类型type myvar is varray(5)of varchar2(20);-- 声明变量
v myvar;begin
v:=myvar('a','b','c');
dbms_output.put_line(v(1));
dbms_output.put_line(v(2));
dbms_output.put_line(v(3));-- v.delete() 变长数组不能指定删除,-- v.extend() 扩展时不能超过声明时的长度end;
遍历变长数组
/*
loop
*/declare-- 声明变长数组类型type myvar is varray(5)of varchar2(20);-- 声明变量
v myvar;-- 声明变量
n pls_integer;begin
v:=myvar('a','b','c','d');
n:=v.first;loop
dbms_output.put_line(n);exitwhen n=v.last;
n:=v.next(n);endloop;end;/*
for
*/declare-- 声明变长数组类型type myvar is varray(5)of varchar2(20);-- 声明变量
v myvar;begin
v:=myvar('a','b','c','d');for n in v.first..v.lastloop
dbms_output.put_line(n);endloop;end;/*
while
*/declare-- 声明变长数组类型type myvar is varray(5)of varchar2(20);-- 声明变量
v myvar;-- 声明变量
n pls_integer;begin
v:=myvar('a','b','c','d');
n:=v.first;while n<=v.lastloop
dbms_output.put_line(n);
n:=v.next(n);endloop;end;
变长数组在数据库中的使用
/*
变长数组在数据库中的使用:
create type 类型名称 is varray(长度)|varying array(长度) of 数据类型;
*/createtype myvarray is varray(5)of varchar2(20);declare-- 声明变量
v myvarray;begin
v:=myvarray('a','b','c','d');for n in v.first..v.lastloop
dbms_output.put_line(n);endloop;end;/*
创建表
create table 表名(
列名 数据类型,
数组列 数组类型
);
*/createtable b(
id number,
abc myvarray
);-- 查询select*from b;-- 增加insertinto b(id,abc)values(1,myvarray('a','b','c','d'));select*fromtable(select abc from b where id=1);
bulk collect
/*
可以把一组数据取出来存入一个集合类型中
我们之前那个select...into 变量:只能查出一条数据保存到变量中
*/declare
v_ename emp.ename%type;beginselect ename into v_ename from emp where empno=7369;
dbms_output.put_line(v_ename);end;/*
而使用 select。。bulk collect into 集合类型的变量:
可以取多条数据存储在集合中
*/declare
v_ename emp.ename%type;-- 定义集合类型嵌套表type mytable istableof emp.ename%type;-- 定义集合变量
v mytable;beginselect ename into v_ename from emp where empno=7369;
dbms_output.put_line(v_ename);
dbms_output.put_line('--------------');select ename bulk collect into v from emp;-- 遍历集合中所以的元素for n in v.first..v.lastloop
dbms_output.put_line(v(n));endloop;end;/*
bulk collect 还可以玩游标
fetch 游标 bulk collect into 集合类型变量
*/declare-- 声明游标变量cursor cur_emp isselect*from emp;-- 声明变量
v_emp emp%rowtype;beginopen cur_emp;loopfetch cur_emp into v_emp;exitwhen cur_emp%notfound;
dbms_output.put_line(v_emp.empno);endloop;close cur_emp;end;declare-- 声明游标变量cursor cur_emp isselect*from emp;-- 声明集合类型嵌套表type mytable istableof emp%rowtype;-- 声明集合变量
v mytable;beginopen cur_emp;fetch cur_emp bulk collect into v;for n in v.first..v.lastloop
dbms_output.put_line(v(n).empno)endloop;close cur_emp;end;
批量绑定
/*
格式:
forall 变量 in 集合
sql语句:insert、delete、update
*/-- 删除所有有部门编号的员工信息declare-- 定义集合type mytable istableof dept.deptno%type;-- 定义集合变量
v mytable;beginselect deptno bulk collect into v from dept;/*
这是一种
for n in v.first..v.last loop
delete from emp where deptno = v(n);
end loop;
*/-- 这是forall
forall n in v.first..v.lastdeletefrom emp where deptno = v(n);--update emp set sal=8000 where deptno=v(n);--insert into emp(empno) values(v(n));end;