总结一下游标的使用
/********************************游标*********** 游标特点:通过循环来处理多条数据,每次处理一条 游标分类:静态游标和引用游标(动态游标) 静态游标:隐式游标和显示游标 显示游标:普通游标 带参数的游标 循环游标 引用游标:弱类型游标和强类型游标 游标的4个属性: isopen 表示:游标是否打开 rowcount 表示 游标影响数据条数 found / notfound 表示:游标当前数据行的数据是否有效 对于隐式游标访问属性: sql% *********************************************************/
----隐式游标 begin dbms_output.put_line('游标影响数据行数:' || sql%rowcount); update emp set sal=1000 where deptno=10; if (sql%isopen) then dbms_output.put_line('open'); else dbms_output.put_line('close'); end if; dbms_output.put_line('游标影响数据行数:' || sql%rowcount); end;
---显示游标(必须在使用前定义) /*********************** 游标操作步骤: 1.定义游标 2.打开游标 3.读取游标保存数据到变量 4.关闭游标
普通游标语法: declare ---定义游标 cursor 游标名称 is 查询语句;(确定游标处理数据范围[行与列]) begin ---打开游标 open 游标名称; ---通过循环对游标进行访问 loop fetch 游标名称 into 变量 end loop; ---关闭游标 end;
**********************/
---显示部门编号为20所有员工的编号和姓名 declare ---定义游标 cursor mycur is select empno,ename from emp where deptno=20; ---编号 myempno emp.empno%type; --姓名 myename emp.ename%type; begin ---打开游标 open mycur; ---读取游标数据 loop ---在读取游标,在保存变量的时候,字段与定义游标字段一致 fetch mycur into myempno,myename; exit when mycur%notfound; dbms_output.put_line('编号--'||myempno||' 姓名-'||myename); end loop; ---关闭游标 close mycur; end;
----根据输入部门编号,来显示对应部门所有员工信息 ----带参数游标 /********************** 语法: declare cursor 游标名称(游标参数列表) is 查询语句 begin open 游标名称(游标实际参数) end; *************************/
declare ---定义游标 cursor mycur(mydeptno emp.deptno%type) is select * from emp where
deptno=mydeptno; inputdeptno emp.deptno%type; emprow emp%rowtype; begin inputdeptno := &请输入部门编号; ---打开游标,并 传入参数 open mycur(inputdeptno); loop fetch mycur into emprow; exit when mycur%notfound; dbms_output.put_line('编号--'|| emprow.empno || ' 姓名--'||emprow.ename || ' 工作'||emprow.job); end loop; --关闭游标 close mycur; end;
/******************循环游标********************** 语法: delcare cursor 游标名称 is 查询语句; begin for 游标变量 in 游标名称 loop 执行语句 end loop; end; 注意:在循环游标中,不需要有打开游标,关闭游标 在循环游标中,游标变量是不需要声明 ***************************************************/
---显示部门编号为20员工信息 declare cursor mycur is select * from emp where deptno=20; begin for emprow in mycur loop dbms_output.put_line('编号--'|| emprow.empno || ' 姓名--'||emprow.ename || ' 工作'||emprow.job); end loop; end;
/****************************************** 通过游标修改数据(update,delete) 语法: declare ---定义游标 cursor 游标名称 is 查询语句 for update;---在定义游标时候,要对处理数据进行锁定 begin ----使用游标修改数据 update table_name set 字段 where current of 游标名称; ---使用游标删除数据 delete语句 where current of 游标名称; end; *****************************************/
-----根据输入部门编号修改对应员工的工资为2500 declare ---定义游标 cursor mycur(mydeptno emp.deptno%type) is select * from emp where
deptno=mydeptno for update; inputdeptno emp.deptno%type; begin inputdeptno :=&请输入部门编号; for emprow in mycur(inputdeptno) loop ---对数据进行修改 dbms_output.put_line('修改员工对应编号--'||emprow.empno); --update emp set sal=2500 where current of mycur; delete from emp where current of mycur; dbms_output.put_line('修改数据的条数:' || mycur%rowcount); end loop; end;
----使用普通游标修改部门编号为20的员工信息 declare cursor mycur(mydeptno emp.deptno%type) is select * from emp where deptno=mydeptno
for update; emprow emp%rowtype; inputdeptno emp.deptno%type; begin inputdeptno :=&请输入部门编号; open mycur(inputdeptno); loop fetch mycur into emprow; exit when mycur%notfound; dbms_output.put_line('修改员工对应编号--'||emprow.empno); update emp set sal=2500 where current of mycur; end loop; close mycur; end;
/***********************引用游标******************* 引用游标:弱类型游标和强类型游标
弱类型游标处理的语法: declare ---定义游标类型 type 游标类型 is ref cursor; ---定义对应游标变量 游标变量的名称 游标类型; begin --打开游标(引用在打开游标的时候,确定处理数据的行与列) open 游标名称 for 查询语句; end; 引用游标注意: 1.在使用游标之前,必须需要定义游标类型。 2.在引用游标中,不能使用循环游标
---input ---当input=1 显示部门编号为10员工的姓名 工作 ---当input=2显示部门编号为20员工的姓名 与 工资 ***********************************/ declare ---定义游标的类型 type mycurtype is ref cursor; ---定义此类型的游标变量 mycur mycurtype; ---定义游标变量 myename emp.ename%type; myjob emp.job%type; mysal emp.sal%type; ---辨识 input char(10); begin input := '&请输入'; if input = '1' then --显示部门编号为10员工的姓名 工作 ---打开游标 open mycur for select ename,job from emp where deptno=10; loop fetch mycur into myename,myjob; exit when mycur%notfound; dbms_output.put_line('姓名:'||myename ||' 工作:'||myjob); end loop; else -- 显示部门编号为20员工的姓名 与 工资 open mycur for select ename,sal from emp where deptno=20; loop fetch mycur into myename,mysal; exit when mycur%notfound; dbms_output.put_line('姓名:'||myename||' 薪水: '||mysal); end loop; end if; --- 关闭游标 close mycur; end;
/***************************** 强类型游标语法: declare ---定义游标类型 type 游标类型 is ref cursor return 类型; ---定义对应游标变量 游标变量的名称 游标类型; begin --打开游标(引用在打开游标的时候,确定处理数据的行与列) open 游标名称 for 查询语句; end; ********************************/
--input --input 的值1 显示部门编号为10 员工信息 ---input的值2 显示部门编号为20员工信息
declare ---定义游标类型 type mycurtype is ref cursor return emp%rowtype; ---定义游标 mycur mycurtype; --游标变量 emprow emp%rowtype; --辨识 input char(10); begin input := '&请输入'; if input = '1' then open mycur for select * from emp where deptno=10; else open mycur for select * from emp where deptno=20; end if; loop fetch mycur into emprow; exit when mycur%notfound; dbms_output.put_line('编号:'||emprow.empno||' 姓名:'||emprow.ename); end loop; ---关闭游标 close mycur; end;