您的位置:首页 > 数据库 > Oracle

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

2017-05-06 11:14 405 查看
游标

注意:与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。


博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐