V_s t_s;
V_index binary_integer;--索引号
V_loop binary_integer;--循环次数
Begin
Select * into v_s(10) from scott.emp whereempno='7788';
Select * into v_s(22) fromscott.emp where empno='7902';
Select * into v_s(-12) fromscott.emp where empno='7934';
V_index:= v_s.first;
V_loop:=v_s.count;
Loop
Dbms_output.put_line(v_s(v_index).empno);
V_index:=v_s.next(v_index);
V_loop:=v_loop-1;
Exit when v_loop<=0;
End loop;
V_index:=v_s.last;
v_s.delete(v_index);
V_index:= v_s.first;
V_loop:=v_s.count;
Loop
Dbms_output.put_line(v_s(v_index).empno);
V_index:=v_s.next(v_index);
V_loop:=v_loop-1;
Exit when v_loop<=0;
End loop;
End;
3、 集合数据类型――变长数组
介绍:变长数组:是一个存储有序元素的集合,每个元素都有一个索引,该索引相对应元素在数组中的位置。变长数组存在大小的限制,但是可以动态进行更改。
创建变长数组语句:
案例
--创建一个变长数组
Create Type varray_phone as varray(3) of varchar2(50);
--创建一个人员表,表中人员拥有一列电话(可能有1、2或3个电话号码)。
create table person3
(
id integer constraintperson3_pk primary key,
first_name varchar(20),
last_name varchar(20),
phone varray_phone
)
--填充变长数组
insert into person3values(1,'yuan','weixiang',varray_phone('12345','34567','56789'));
select * from person3;
insert intoperson3 values(2,'hao','lihai',varray_phone());
select * from person3;
--修改变长数组中的元素
update person3 setphone= varray_phone('12345','34567') where id = 2;
select * from person3;
--修改变长数组的元素的长度大小
Alter type varray_phone modifyelement type varchar2(49) cascade --报错
Alter type varray_phone modify element type varchar2(60)cascade
说明:cascade选项把更改传播到数据库中的依赖对象 Person3就是依赖对象
--修改变长数组元素的数目
alter type varray_phonemodify limit 2 cascade -- 报错,varray限制只能增大
alter type varray_phonemodify limit 5 cascade
insert into person3 values(3,'yuan','weixiang',varray_phone('12345','34567','56789','34567','56789'));
4、 游标
介绍:在PL/SQL程序设计中,有时需要对查询返回结果集进行逐行处理,这就需要将该查询返回结果集缓存到一个内存区中,为了能对返回的结果集进行逐行操作,需返回该内存区的首地址,这个地址被称为游标。
定义游标语法
Cursor 游标名 is select语句;
注意:在游标定义中的select语句不能包含into子句。
游标属性
| 游标属性 |
描 述 |
| 游标名%isopen |
布尔值,如果游标已打开,取值为true,否则为false。 |
| 游标名%notfound |
布尔值,如果最近一次fetch操作没有返回结果,则取值为true,否则为false。 |
| 游标名%found |
布尔值,如果最近一次fetch操作没有返回结果,则取值为false,否则为true。 |
| 游标名%rowcount |
数字型值,值为到当前为止返回的行数。 |
案例
举例1
DECLARE
v_no scott.emp.empno%type;
v_name scott.emp.ename%type;
CURSORc_e IS SELECT empno, ename FROM scott.emp;
BEGIN
OPEN c_e;
LOOP
FETCH c_e INTO v_no, v_name;
EXIT WHEN c_e%NOTFOUND;
Dbms_output.put_lint(v_no||' '||v_name);
END LOOP;
CLOSE c_e;
END;
举例2
DECLARE
CURSOR c_e IS SELECT empno, ename FROM scott.emp;
BEGIN
For c1 in c_e loop
Dbms_output.put_lint(c1.empno||' '||c1.ename);
END LOOP;
END;
5、 可更新的游标
介绍:从游标中抽取数据,可以对数据库中的数据进行update和delete操作。
语法:在定义游标时,必须加for update of子句;在update和delete语句中加上where current of子句。
案例
举例1:对scott方案emp表中某部门的各员工,如果其工资小于1600元,则将其工资设为1600元。
Accept p_deptno prompt‘please enter the deptno’;
--Accept类似与c语言中的scanf,意为从屏幕接受输入到p_deptno变量中。
declare
v_deptno scott.emp.deptno%type:=&p_deptno;
cursor emp_cursor is select empno,job,sal from scott.emp wheredeptno=v_deptno for update of sal;
begin
for emp_record in emp_cursor loop
if emp_record.sal<1600 then
update emp set sal=1600 where currentof emp_cursor;
end if;
end loop;
end;
举例2:为职工涨工资,对员工按工资从低到高排序,从工资低的员工开始涨,每位员工涨10%。但要控制员工总工资在50万之内,一旦总额超过50万,就停止对剩余的员工涨工资。
6、 带参数的游标
介绍:定义显示游标时,可以加入参数的定义。在使用游标时,对于参数输入不同的数值,则游标缓