Oracle游标举例

--游标

--显式游标

--显式游标的使用方式
--4个步骤
--定义游标
--语法:cursor 游标名 is 查询子句
--打开游标
--语法: open 游标名
--获取结果(遍历游标)
--语法:fetch 游标名 into 变量
--关闭游标
--语法:close 游标名

DECLARE
  CURSOR cur_stu IS
    SELECT * FROM student;
  rec_stu student%ROWTYPE;
BEGIN
  OPEN cur_stu;
  FETCH cur_stu
    INTO rec_stu;
  CLOSE cur_stu;
  dbms_output.put_line(rec_stu.s_name);
END;

DECLARE
--定义一个游标,游标指向的结果集是后面查询的结果
  CURSOR cur_stu IS
    SELECT * FROM student;
    --定义记录类型,获取一行结果
  rec_stu student%ROWTYPE;
BEGIN
--打开游标(执行查询)
  OPEN cur_stu;
  --通过循环,遍历结果集
  LOOP
  --fetch 将游标指向下一行,into将该行的值放到记录中
    FETCH cur_stu
      INTO rec_stu;
      --获取游标的%NOTFOUND属性,如果没有取到下一行,属性值为ture;
      --如果为ture,意味着没有下一行了,跳出循环
    EXIT WHEN cur_stu%NOTFOUND;
    --如果没有跳出循环,意味着有下一行,输出他的值
    dbms_output.put_line(rec_stu.s_name);
  END LOOP;
  --关闭游标
  CLOSE cur_stu;
END;

--练习,查询员工姓名和部门地址
DECLARE
  CURSOR cur_emp IS
    SELECT e.ename, d.loc FROM emp e, dept d WHERE e.deptno = d.deptno;
  v_name emp.ename%TYPE;
  v_loc  dept.loc%TYPE;
BEGIN
  OPEN cur_emp;
  LOOP
    FETCH cur_emp
      INTO v_name, v_loc;
    EXIT WHEN cur_emp%NOTFOUND;
    dbms_output.put_line(v_name || '在' || v_loc || '上班');
  END LOOP;
END;

--参数游标,定义游标时,可以给他加参数
DECLARE
  CURSOR cur_stu(p_age student.s_age%type) IS
    SELECT * FROM student WHERE s_age <= p_age;
  rec_stu student%ROWTYPE;
BEGIN
  OPEN cur_stu(18);
  LOOP
    FETCH cur_stu
      INTO rec_stu;
    EXIT WHEN cur_stu%NOTFOUND;
    dbms_output.put_line(rec_stu.s_name);
  END LOOP;
  CLOSE cur_stu;
END;

--使用隐式游标,不需要定义,可以获取到最近一次操作的隐式游标
--游标名是sql
--通过4个属性知道DML操作的结果
BEGIN
  UPDATE stu SET s_name = s_name || 'a' WHERE s_name LIKE '%lao%';
  IF SQL%FOUND THEN
    dbms_output.put_line(SQL%ROWCOUNT);
  ELSE
    dbms_output.put_line('没有数据被修改');
  END IF;
END;

--游标for循环,遍历数据最简单的形式
--会自动打开游标
--在循环定义位置自动生成记录类型的实例
DECLARE
  CURSOR cur_stu IS
    SELECT * FROM student;
BEGIN
  FOR stu_rec IN cur_stu LOOP
    dbms_output.put_line(stu_rec.s_name || ' ' || stu_rec.s_class);
  END LOOP;
END;

--游标变量
--不同之处:声明游标变量时,不与某个固定的查询挂钩
--在打开游标时,才指定查询语句
--一个游标可以执行不同的查询,多次使用
--由于open时要指定查询语句,不能用游标for循环
DECLARE
  TYPE cur_type IS REF CURSOR;
  cur_stu cur_type;
  stu_rec student%ROWTYPE;
  emp_rec emp%ROWTYPE;
BEGIN
  OPEN cur_stu FOR
    SELECT * FROM student;
  LOOP
    FETCH cur_stu
      INTO stu_rec;
    EXIT WHEN cur_stu%NOTFOUND;
    dbms_output.put_line(stu_rec.s_name || ' ' || stu_rec.s_class);
  END LOOP;
  CLOSE cur_stu;
  OPEN cur_stu FOR
    SELECT * FROM emp;
  LOOP
    FETCH cur_stu
      INTO emp_rec;
    EXIT WHEN cur_stu%NOTFOUND;
    dbms_output.put_line(emp_rec.ename || ' ' || emp_rec.sal);
  END LOOP;
  CLOSE cur_stu;
END;



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值