1.游标的定义
游标(Cursor),也称之为光标,从字面意思理解就是游动的光标。
游标是映射在结果集中一行数据上的位置实体。
游标是从表中检索出 结果集,并从中每次指向一条记录进行交互的机制。
2. 游标的声明
CURSOR 游标名 [ (参数名 数据类型[,参数名 数据类型]...)]
IS SELECT 语句;
【示例】
无参游标:
cursor c_emp is select ename from emp;
有参游标:
cursorc_emp(v_deptno emp.deptno%TYPE) is select ename from emp where deptno=v_deptno;3.游标的属性
游标的属性 | 返回值类型 | 说明 |
%ROWCOUNT | 整型 | 获得FETCH语句返回的数据行数 |
%FOUND | 布尔型 | 最近的FETCH语句返回一行数据则为真,否则为假 |
%NOTFOUND | 布尔型 | 与%FOUND属性返回值相反 |
%ISOPEN | 布尔型 | 游标已经打开时值为真,否则为假 |
4.游标的使用案列
--使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来。
DECLARE
--声明一个游标
CURSOR C_EMP ISSELECT * FROM EMP;
--记录型变量
v_emp emp%ROWTYPE;
BEGIN
--打开游标,执行查询
OPEN C_EMP;
--使用游标,循环取值
LOOP
--获取游标的值放入变量的时候,必须要into前后要对应(数量和类型)
FETCH C_EMP INTO v_emp;
EXITWHEN C_EMP%NOTFOUND;
--输出打印
DBMS_OUTPUT.PUT_LINE('员工的姓名:' || v_emp.ename || ',员工的工资' || v_emp.sal);
ENDLOOP;
CLOSE c_emp ;--关闭游标,释放资源
END;
5.SCOTT表使用游标案列,上面有讲解了下面的就不写解释了。
(1)例题:显示30部门的所有员工的编号及姓名,要求格式是 编号--姓名
DECLARE
erow emp%ROWTYPE;
CURSOR cur_1 IS SELECT * FROM emp WHERE deptno=30;
BEGIN
OPEN cur_1;
LOOP
FETCH cur_1 INTO erow;
EXIT WHEN cur_1%NOTFOUND;
dbms_output.put_line(erow.empno||'-----'||erow.ename);
END LOOP;
CLOSE cur_1;
END;
(2)例题:显示30部门的所有员工的编号及姓名,要求格式是 编号--姓名
(部门编号手动输入)
DECLARE
erow emp%ROWTYPE;
CURSOR cur_2 IS SELECT * FROM emp WHERE deptno=&部门编号;
BEGIN
OPEN cur_2;
LOOP
FETCH cur_2 INTO erow;
EXIT WHEN cur_2%NOTFOUND;
dbms_output.put_line(erow.empno||'-----------'||erow.ename);
END LOOP;
CLOSE cur_2;
END;
(3)例题查询10号部门的员工的姓名和薪资
DECLARE
CURSOR c_1 (v_deptno emp.deptno%TYPE) IS SELECT ename,sal FROM emp WHERE deptno=v_deptno;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
OPEN c_1(10);
LOOP
FETCH c_1 INTO v_ename,v_sal;
EXIT WHEN c_1%NOTFOUND;
dbms_output.put_line(v_ename||'---'||v_sal);
END LOOP;
CLOSE c_1;
END;
DECLARE
CURSOR c_2(v_deptno emp.deptno%TYPE) IS SELECT ename,sal FROM emp WHERE deptno = v_deptno;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
vv_deptno emp.deptno%TYPE;
BEGIN
vv_deptno :=&部门编号;
OPEN c_2(vv_deptno);
LOOP
FETCH c_2 INTO v_ename,v_sal;
EXIT WHEN c_2%NOTFOUND;
dbms_output.put_line(v_ename||'--'||v_sal);
END LOOP;
CLOSE c_2;
END;