Oracle-cursor游标和动态游标
程序员文章站
2024-02-10 14:21:52
...
游标
游标是数据库的一个数据缓冲区,存放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;