显示游标 暂存查询取出的多行数据,然后一行一行地进行处理 使用步骤 : ①声明游标: cursor 游标名 is select 语句; ②打开游标:声明的游标必须打开后才能使用 open 游标名称;–相当于执行查询语句 ③使用游标:一般在循环语句中使用fetch语句提取游标中的记录来进行操作 ④关闭游标:游标使用完毕后,一定要关闭 close 游标名称; declare–定义游标 cursor mycursor is select * from emp; my_emp emp%rowtype;begin --打开游标 open mycursor;–读取游标 fetch mycursor into my_emp; dbms_output.put_line(my_emp.ename||’ ‘||my_emp.sal);–关闭游标 close mycursor;end;在emp表中对某部门的员工薪水增加100元,并显示本次更新操作共涉及了多少员工普通方法: declare dno number(4):=&d; s number(4);begin update emp set sal=sal+100 where deptno=dno; select count(*) into s from emp where deptno=dno; dbms_output.put_line(s);end; 隐式游标:由系统自动创建并管理declare dno number(4):=&d;begin update emp set sal=sal+100 where deptno=dno; dbms_output.put_line(sql%rowcount);end; 声明一个游标,用于取得部门10的员工的姓名和薪水信息 用记录接收游标中的数据declare v_name emp.ename%type; v_sal emp.sal%type; cursor my_cursor is select ename,sal from emp where deptno=10; begin open my_cursor; loop fetch my_cursor into v_name,v_sal; exit when my_cursor%notfound; dbms_output.put_line(v_name||’ ‘||v_sal); end loop; close my_cursor;end;declare type my_record is record ( v_name emp.ename%type, v_sal emp.sal%type ); cursor my_cursor is select ename,sal from emp where deptno=10; my my_record;begin open my_cursor; loop fetch my_cursor into my.v_name,my.v_sal; exit when my_cursor%notfound; dbms_output.put_line(my.v_name||’ ‘||my.v_sal); end loop; close my_cursor;end; 参数游标:需要对某一字段进行多值查询通过键盘录入,查询部门编号为10员工信息 declare cursor my_cursor(d_no emp.deptno%type) is select ename,sal from emp where deptno=d_no; v_name emp.ename%type; v_sal emp.sal%type;begin open my_cursor(&a); loop fetch my_cursor into v_name,v_sal; exit when my_cursor%notfound; dbms_output.put_line(v_name||’ ‘||v_sal); end loop; close my_cursor;end; 查询某部门的员工姓名和薪水declare cursor my_cursor(d_no emp.deptno%type) is select ename,sal from emp where deptno=d_no; v_name emp.ename%type; v_sal emp.sal%type;begin open my_cursor(20); loop fetch my_cursor into v_name,v_sal; exit when my_cursor%notfound; dbms_output.put_line(v_name||’ ‘||v_sal); end loop; close my_cursor;end;强型游标: 声明一个强型游标的变量 1. 有一个记录类型 2. 声明游标返回上面定义的记录类型 3. 声明一个强型游标变量 显示员工表中的姓名和工资记录 declare–1. 有一个记录类型type my_record is record(v_name emp.ename%type,v_sal emp.sal%type);–2. 声明游标返回上面定义的记录类型type my_coursor is ref cursor return my_record;–3. 声明一个强型游标变量my my_coursor;my1 my%rowtype;beginopen my for select ename,sal from emp;loopfetch my into my1;exit when my%notfound;dbms_output.put_line(my1.v_name||’ ‘||my1.v_sal);end loop;close my;end; 根据输入的字符确定显示哪一张表中的数据declaretype my_coursor is ref cursor;my my_coursor;emprec emp%rowtype;deptrec dept%rowtype;v_input char(1):=’&input’;beginif upper(v_input)=‘E’ thenopen my for select * from emp;loopfetch my into emprec;exit when my%notfound;dbms_output.put_line(emprec.ename||’ ‘||emprec.sal);end loop;elsif upper(v_input)=‘D’ then open my for select * from dept;loopfetch my into deptrec;exit when my%notfound;dbms_output.put_line(deptrec.dname||’ ‘||deptrec.loc);end loop;else dbms_output.put_line(’ 输入错误 ');end if;close my;end;
|