oracle游标的使用

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;
(4)例题查询 10 号部门的员工的姓名和薪资(部门手动输入)
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;



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值