Oracle-cursor游标和动态游标

本文介绍了Oracle数据库中的游标概念,包括游标的隐性属性、声明和使用,特别强调了for循环和fetch操作在使用游标中的应用。此外,还探讨了动态游标及其语法,例如遍历特定表tablasp的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游标

游标是数据库的一个数据缓冲区,存放SQL语句执行结果。

用于遍历结果集和定位结果集的一条记录。

游标隐性属性
隐性游标属性返回值类型意义
%found布尔型从游标的结果集中获取记录时,找到了记录,为true
%notfound布尔型从游标的结果集中获取记录时,结果集中没有记录,为true
%rowcount整型代表DML语句成功执行的数据行数
%isopen布尔型DML执行过程中为真,结束后为假
声明游标
cursor 游标名称 is select语句
使用游标
for循环使用游标

例:输出emp表中的1004部门的员工 declare

  --声明游标,emp_corsor里面存储了select语句的多行记录

  cursor emp_corsor is select ename,ejob,esalary,ecomn from emp where did='1004';

  --声明变量c_row使用rowtype类型,存储一条记录

  c_row emp_corsor%rowtype;

begin

  --遍历游标emp_corsor,把获取的每一条记录存储到c_row中

  for c_row in emp_corsor loop

    dbms_output.put_line(c_row.ename||'-'||c_row.ejob||'-'||c_row.esalary||'-'||c_row.ecomn);

  end loop;

end;
fetch使用游标

----------必须先要打开游标,用完后需要关闭

打开游标

open 游标名称;

关闭游标

close 游标名称;
declare

    --声明游标,emp_corsor里面存储了select语句的多行记录

  cursor c_emp is select esalary,ecomn from emp where did='1004';

  --声明变量c_row使用rowtype类型,存储一条记录  

  c_row c_emp%rowtype;

begin

  --打开游标

  open c_emp;

  --循环输出数据

  loop

    --将c_emp游标中的记录,提取一行记录到c_row

    fetch c_emp into c_row;

    --%notfound 找不到时候返回ture,找到值返回false

    --结合exit使用,判读是否提取到值,没取到值就退出

    --取到值c_job%notfound 是false

    --取不到值c_job%notfound 是true

    exit when c_emp%notfound;

    dbms_output.put_line(c_row.esalary||'-'||c_row.ecomn);

  end loop;

  --关闭游标

  close c_emp;

end;

动态游标

语法

type 动态游标类型名 is ref cursor;  ---- 声明一个动态游标类型,紫色填写一样内容

游标名 动态游标类型; ---- 声明一个动态游标类型的变量,这个变量就是动态游标类型的,也就是动态游标

open 游标名 for SQL语句; ---- 打开游标,并且把SQL语句和游标关联起来

close 游标名;
遍历tablesp表
--创建过程

create or replace procedure proc_select

is

sql_select varchar(400);

sql_row tablesp%rowtype;

type cur_select is ref cursor; --声明一个动态游标类型,名字叫cur_select,因为游标不是类型所以要声明一个动态游标类型

curs cur_select;  --声明一个动态游标变量,名字叫curs

begin

  sql_select:='select * from tablesp'; -- 需要执行的SQL语句

  open curs for sql_select;    -- 打开游标,并且SQL执行结果存放到curs中

  loop

    fetch curs into sql_row;  -- 把curs中的一条记录赋值为 sql_row

    dbms_output.put_line(sql_row.tid||'-'||sql_row.tname||'-'||sql_row.tage);

    exit when curs%notfound;  -- 退出循环

  end loop;

  close curs;

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值