Oracle显式游标与隐式游标



显式游标和隐式游标都可实现对记录的循环操作。显式游标需要用户遵循声明、打开、捕获记录、操作记录和关闭等步骤。隐式游标无须如此繁的步骤,而更接近于其他编程语言中的for循环。
虽然显式游标操作复杂,但使用上却可以更加灵活,例如,打开游标时传递参数,可以创建更加灵活多样的游标。相对而言,隐式游标步骤简练,但用户不能进行干预,因此适合于简单的游标操作。
一、显式游标:
可以方便地控制游标的生命周期。
1.声明游标:
语法:delcare cursor 游标名称 is 查询语句;
2.声明列变量:
语法:变量名 原列名%type; 
3.声明行变量:
语法:变量名 表名%rowtype; 
如:
declare cursor cu_employee is
select * from employees;
employee employees%rowtype;
注:选择的必须为所有列*。
4.使用显式游标:
打开游标:
open 游标名称
捕获数据:
fetch 游标名称 into 变量
5.使用普通变量获取游标信息:
SQL> set serverout on;
SQL> declare cursor cu_employee is
select employee_id,employee_name,employee_age
from employees;
employee_id number;
employee_name varchar2(20);
employee_age number;
begin
open cu_employee;
fetch cu_employee into employee_id,employee_name,employee_age;
while cu_employee%found loop
dbms_output.put_line(employee_id || ':' ||employee_name || ':' || employee_age);
fetch cu_employee into employee_id,employee_name,employee_age;
end loop;
end;
/
1:王晓:37
2:钟小平:32
3:刘俊:27
4:王龙:26
5:钟文:26
6:张三:25
7:李四:24
8:王五:25
19:Jamaly:
20:吖ling:
PL/SQL procedure successfully completed
6.使用行类型变量来获取游标信息:
SQL> declare cursor cu_employee is
select *   --必须为*
from employees;
employee employees%rowtype;
begin
open cu_employee;
fetch cu_employee into employee;
while cu_employee%found loop
dbms_output.put_line(employee.employee_id || ':' || employee.employee_name || ':' || employee.employee_age);
fetch cu_employee into employee;
end loop;
close cu_employee;
end;
/
1:王晓:37
2:钟小平:32
3:刘俊:27
4:王龙:26
5:钟文:26
6:张三:25
7:李四:24
8:王五:25
19:Jamaly:
20:吖ling:
PL/SQL procedure successfully completed
7.为游标传递参数:
SQL> declare cursor cu_employee(minAge in number,maxAge in number) is
select *
from employees
where employee_age>=minAge and employee_age<=maxAge;
employee employees%rowtype;
begin
open cu_employee(21,30);
fetch cu_employee into employee;
while cu_employee%found loop
dbms_output.put_line(employee.employee_id || ':' || employee.employee_name || ':' || employee.employee_age);
fetch cu_employee into employee;
end loop;
close cu_employee;
end;
/
3:刘俊:27
4:王龙:26
5:钟文:26
6:张三:25
7:李四:24
8:王五:25
PL/SQL procedure successfully completed
8.游标属性:
8.1 found: fetch捕获记录成功。
8.2 not found: fetch捕获不成功。
8.3 rowcount: 返回当前时刻已捕获的记录数。
8.4 isopen: 游标是否打开。
二、隐式游标
分为sql隐式游标和 cursor for 游标。
1.查看sql 隐式游标的默认值:
SQL> begin
if sql%isopen then
dbms_output.put_line('sql is open');
else
dbms_output.put_line('sql is not open');
end if;
dbms_output.put_line('rowcount is' || sql%rowcount);
end;
/
sql is not open
rowcount is
2.查询语句对sql隐式游标的影响:
SQL> declare employee_age number;
begin
select employee_age into employee_age from employees where employee_id=1;
if sql%isopen then
dbms_output.put_line('sql 游标已打开');
else
dbms_output.put_line('sql 游标未打开');
end if;
dbms_output.put_line('游标捕获记录数: ' || sql%rowcount);
end;
/
sql 游标未打开
游标捕获记录数: 1
3.更新语句对sql隐式游标的影响:
3.1
 SQL> begin
update employees set employee_age=employee_age+1;
if sql%isopen then
dbms_output.put_line('sql 游标已打开');
else
dbms_output.put_line('sql 游标未打开');
end if;
dbms_output.put_line('游标捕获记录数: ' || sql%rowcount);
end;
/
sql 游标未打开
游标捕获记录数: 10
3.2 sql 游标属性信息保留为最后一条语句的更新信息。
SQL> begin
update employees set employee_age=employee_age+1;
insert into employees(employee_id,employee_name,employee_age)
values(21,'Asha',23);
if sql%isopen then
dbms_output.put_line('sql 游标已打开');
else
dbms_output.put_line('sql 游标未打开');
end if;
dbms_output.put_line('游标捕获记录数: ' || sql%rowcount);
end;
/
sql 游标未打开
游标捕获记录数: 1
4.sql 隐式游标的使用:
插入一条记录,如果存在对记录各列更新,否则,插入该记录:
SQL> begin
update employees set employee_name='MLing' ,employee_age=22
where employee_id=9;
if sql%rowcount=0 then
insert into employees(employee_id,employee_name,employee_age)
values(9,'MLing',22);
end if;
end;
/
5.cursor for 游标的使用:
语法:
for 游标变量 in (查询) loop
DML操作
end loop;
SQL> begin
for employee in (select * from employees where employee_id<=6) loop
dbms_output.put_line(employee.employee_id || ':' || employee.employee_name
|| ':' || employee.employee_age);
end loop;
end;
/
1:王晓:39
2:钟小平:34
3:刘俊:29
4:王龙:28
5:钟文:28
6:张三:27
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值