Oracle游标创建和使用的语法和举例(显示和隐式游标)

游标
注意:与sql的游标定义不同,Oracle游标可以带输入变量和输出类型
            使用游标的时候,可以输入参数,也可以不输入

declear cursor 游标名[(变量名 [in] 类型[:=缺省])]
[return ret_type]
is select query;
其他变量定义;
begin
open 游标名(参数);--/open 游标名;/open 游标名();
fetch 游标名 into 变量;
while 游标名%found loop
sentence;
fetch 游标名 into 变量;
end loop;
close 游标名
end

游标可用使用的几个属性
%found是否获取到数据
%notfound是否没有数据
%rowcount受SQL影响的行数
%isopen游标是否打开状态

显式游标的例子
--使用游标获取岗位为employees的姓名+电话+工资
set serveroutput on;
declare 
cursor my_cursor(var_job varchar2:='ST_MAN') 
is 
select first_name,phone_number,salary from employees where job_id=var_job and rownum <=3;
type my_record is record  
(var_1 employees.first_name%type,
var_2 employees.phone_number%type,
var_3 employees.salary%type
);
var_myrecord my_record;
begin
dbms_output.put_line('下面演示使用while语句遍历显示游标,不输入参数');
open my_cursor;--没有输入参数,取缺省
fetch my_cursor into var_myrecord;
while my_cursor%found loop  --使用游标属性
dbms_output.put_line('员工'||var_myrecord.var_1||'的联系方式为:'||var_myrecord.var_2||',当前工资为:'||var_myrecord.var_3||'。');
fetch my_cursor into var_myrecord;
end loop;
close my_cursor;--不需要输入变量
dbms_output.put_line('下面演示使用while语句遍历显示游标,输入参数');
open my_cursor('ST_CLERK');--输入参数
fetch my_cursor into var_myrecord;
while my_cursor%found loop  --使用游标属性
dbms_output.put_line('员工'||var_myrecord.var_1||'的联系方式为:'||var_myrecord.var_2||',当前工资为:'||var_myrecord.var_3||'。');
fetch my_cursor into var_myrecord;
end loop;
close my_cursor;--不需要输入变量
--使用for语句遍历显示游标
dbms_output.put_line('下面演示使用for语句遍历显示游标,不输入参数');
for var_myrecord2 in my_cursor()
loop
dbms_output.put_line('员工'||var_myrecord2.first_name||'的联系方式为:'||var_myrecord2.phone_number||',当前工资为:'||var_myrecord2.salary||'。');
end loop;
dbms_output.put_line('下面演示使用for语句遍历显示游标,输入参数');
for var_myrecord2 in my_cursor('ST_CLERK')
loop
dbms_output.put_line('员工'||var_myrecord2.first_name||'的联系方式为:'||var_myrecord2.phone_number||',当前工资为:'||var_myrecord2.salary||'。');
end loop;
end;

执行结果
下面演示使用while语句遍历显示游标,不输入参数
员工Matthew的联系方式为:650.123.1234,当前工资为:8000。
员工Adam的联系方式为:650.123.2234,当前工资为:8200。
员工Payam的联系方式为:650.123.3234,当前工资为:7900。
下面演示使用while语句遍历显示游标,输入参数
员工Julia的联系方式为:650.124.1214,当前工资为:3200。
员工Irene的联系方式为:650.124.1224,当前工资为:2700。
员工James的联系方式为:650.124.1334,当前工资为:2400。
下面演示使用for语句遍历显示游标,不输入参数
员工Matthew的联系方式为:650.123.1234,当前工资为:8000。
员工Adam的联系方式为:650.123.2234,当前工资为:8200。
员工Payam的联系方式为:650.123.3234,当前工资为:7900。
下面演示使用for语句遍历显示游标,输入参数
员工Julia的联系方式为:650.124.1214,当前工资为:3200。
员工Irene的联系方式为:650.124.1224,当前工资为:2700。
员工James的联系方式为:650.124.1334,当前工资为:2400。

隐式游标
注意:在一个PL/SQL块中出现多个SQL语句,隐式游标的属性值只反映出紧挨着它上面那条SQL的处理结果
set serveroutput on
begin
update employees set salary=salary+100 where job_id='AD_VP';
if sql%notfound then
dbms_output.put_line('');
else
dbms_output.put_line(sql%rowcount||'个员工调整了工资');
end if;
end;

执行结果:
匿名块已完成
2个员工调整了工资

for循环语句与游标

通过for语句循环游标,显示游标上面已经举例,下面举例隐式游标。

注意此时自动计数器不是整型,而是record类型的变量

set serveroutput on
begin
for var_my_record in ( select first_name,phone_number,salary from employees where job_id='AD_VP' and rownum <=3) 
loop
dbms_output.put_line('员工'||var_my_record.first_name||'的联系方式为:'||var_my_record.phone_number||',当前工资为:'||var_my_record.salary||'。');
end loop;
end;

执行结果:
匿名块已完成
员工Neena的联系方式为:515.123.4568,当前工资为:17200。
员工Lex的联系方式为:515.123.4569,当前工资为:17200。


博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值