Oracle 游标使用全解(二)

2015-07-16 12:09:19 · 作者: · 浏览: 11
ect语句
? ? ? select? LOC
? ? ? from Depth;
? ? ? --指定行指针
? ? ? row_loc csr_TestWhile%rowtype;
begin
? --打开游标
? ? ? open csr_TestWhile;
? ? ? --给第一行喂数据
? ? ? fetch csr_TestWhile into row_loc;
? ? ? --测试是否有数据,并执行循环
? ? ? ? while csr_TestWhile%found loop
? ? ? ? ? dbms_output.put_line('部门地点:'||row_loc.LOC);
? ? ? ? ? --给下一行喂数据
? ? ? ? ? fetch csr_TestWhile into row_loc;
? ? ? ? end loop;
? ? ? close csr_TestWhile;
end;
select * from emp


?


? ? ?
--4,接收用户输入的部门编号,用for循环和游标,打印出此部门的所有雇员的所有信息(使用循环游标)
--CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;
--定义参数的语法如下:Parameter_name [IN] data_type[{:=|DEFAULT} value]?


declare
? ? ? CURSOR
? ? ? c_dept(p_deptNo number)
? ? ? is
? ? ? select * from emp where emp.depno=p_deptNo;
? ? ? r_emp emp%rowtype;
begin
? ? ? ? for r_emp in c_dept(20) loop
? ? ? ? ? ? dbms_output.put_line('员工号:'||r_emp.EMPNO||'员工名:'||r_emp.ENAME||'工资:'||r_emp.SAL);
? ? ? ? end loop;
end;
select * from emp?
--5:向游标传递一个工种,显示此工种的所有雇员的所有信息(使用参数游标)
declare
? ? ? cursor
? ? ? c_job(p_job nvarchar2)
? ? ? is
? ? ? select * from emp where JOB=p_job;
? ? ? r_job emp%rowtype;
begin
? ? ? for r_job in c_job('CLERK') loop
? ? ? ? ? dbms_output.put_line('员工号'||r_job.EMPNO||' '||'员工姓名'||r_job.ENAME);
? ? ? ? end loop;
end;
SELECT * FROM EMP


--6:用更新游标来为雇员加佣金:(用if实现,创建一个与emp表一摸一样的emp1表,对emp1表进行修改操作),并将更新前后的数据输出出来
--http://zheng12tian.iteye.com/blog/815770
? ? ? ? create table emp1 as select * from emp;
? ? ? ?
declare
? ? ? ? cursor
? ? ? ? csr_Update
? ? ? ? is
? ? ? ? select * from? emp1 for update OF SAL;
? ? ? ? empInfo csr_Update%rowtype;
? ? ? ? saleInfo? emp1.SAL%TYPE;
begin
? ? FOR empInfo IN csr_Update LOOP
? ? ? IF empInfo.SAL<1500 THEN
? ? ? ? saleInfo:=empInfo.SAL*1.2;
? ? ? elsif empInfo.SAL<2000 THEN
? ? ? ? saleInfo:=empInfo.SAL*1.5;
? ? ? ? elsif empInfo.SAL<3000 THEN
? ? ? ? saleInfo:=empInfo.SAL*2;
? ? ? END IF;
? ? ? UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_Update;
? ? END LOOP;
END;


--7:编写一个PL/SQL程序块,对名字以‘A’或‘S’开始的所有雇员按他们的基本薪水(sal)的10%给他们加薪(对emp1表进行修改操作)
declare
? ? cursor
? ? ? csr_AddSal
? ? is
? ? ? select * from emp1 where ENAME LIKE 'A%' OR ENAME LIKE 'S%' for update OF SAL;
? ? ? r_AddSal csr_AddSal%rowtype;
? ? ? saleInfo? emp1.SAL%TYPE;
begin
? ? ? for r_AddSal in csr_AddSal loop
? ? ? ? ? dbms_output.put_line(r_AddSal.ENAME||'原来的工资:'||r_AddSal.SAL);
? ? ? ? ? saleInfo:=r_AddSal.SAL*1.1;
? ? ? ? ? UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_AddSal;
? ? ? end loop;
end;
--8:编写一个PL/SQL程序块,对所有的salesman增加佣金(comm)500
declare
? ? ? cursor
? ? ? ? ? csr_AddComm(p_job nvarchar2)
? ? ? is
? ? ? ? ? select * from emp1 where? JOB=p_job FOR UPDATE OF COMM;
? ? ? r_AddComm? emp1%rowtype;
? ? ? commInfo emp1.comm%type;
begin
? ? for r_AddComm in csr_AddComm('SALESMAN') LOOP
? ? ? ? commInfo:=r_AddComm.COMM+500;
? ? ? ? UPDATE EMP1 SET COMM=commInfo where CURRENT OF csr_AddComm;
? ? END LOOP;
END;


--9:编写一个PL/SQL程序块,以提升2个资格最老的职员为MANAGER(工作时间越长,资格越老)
--(提示:可以定义一个变量作为计数器控制游标只提取两条数据;也可以在声明游标的时候把雇员中资格最老的两个人查出来放到游标中。)
declare
? ? cursor crs_testComput
? ? is
? ? select * from emp1 order by HIREDATE asc;
? ? --计数器
? ? top_two number:=2;
? ? r_testComput crs_testComput%rowtype;
begin
? ? open crs_testComput;
? ? ? FETCH crs_testComput INTO r_testComput;
? ? ? ? ? while top_two>0 loop
? ? ? ? ? ? dbms_output.put_line('员工姓名:'||r_testComput.ENAME||' 工作时间:'||r_testComput.HIREDATE);
? ? ? ? ? ? --计速器减一
? ? ? ? ? ? top_two:=top_two-1;
? ? ? ? ? ? FETCH crs_testComput INTO r_testComput;
? ? ? ? ? end loop;
? ? close crs_testComput;
end;
? ?


--10:编写一个PL/SQL程序块,对所有雇员按他们的基本薪水(sal)的20%为他们加薪,
--如果增加的薪水大于300就取消加薪(对emp1表进行修改操作,并将更新