游标是数据库的一个数据缓冲区, 存放 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;
来源: https://yq.aliyun.com/articles/675845