Oracle 游标,静态游标(隐式,显式),游标变量,遍历游标

一.隐式游标。

1.隐式游标是由系统自动创建的。通常式有执行SQL语句时创建。

如:

begin

update emp set sal='200' where  dep='人事部'

if sql%notfound then 

dbms_output.put_line('上调失败');

else 

dbms_output.put_line('共有'||sql%rowcount||‘条记录被更新’);

end if;

end;

其中update 更新表中记录,sql%notfound 记录DML操作语句是否有返回数据行,sql%rowcount获取更新行数。

在sql中隐式游标共有4个。

%found 当用户使用DML操作数据时,返回TRUE。%isopen 判断游标是否打开。如果式隐式游标使用总是返回false,代表总是打开。 %notfound 当有DML操作时并且MDL操作没有返回数据时,返回TRUE,否则返回FALSE。%rowcount 返回update 或者select into 操作影响的行数。

二.显示游标。

1.

显示游标通常是有用户创建的,用于对查询结果的查询。游标每次读取只能一行,因此需要循环读取。

1.2

声明游标的语法。

DECLARE CURSOR 游标名称 (参数声明)

IS 查询语句。

1.3

打开游标,读取游标,关闭游标。

OPEN 游标名称(参数)-------打开。

FETCH 游标名称  INTO {RECORD变量}。

CLOSE 游标名称。

在这里说一下RECORD,RECORD是Oracle用来存储游标中的数据的。

实列:

DECLARE CURSOR CUR_YB(var_CS in varchar2)----声明游标来自查询的数据源。

IS select sal,name from emp where dep=var_CS;

TYP REC_EMP IS RECORD (var_sal  emp.sal%type,var_name emp.name%type)----声明一个记录。

emp_row  REC_EMP;

begin

OPEN CUR_YB('人事');-----打开游标并且传入参数。

FETCH CUR_YB  INTO emp_row;-------首先使游标读取到查询的第一行数据。并且存储至emp_row。

while CUR_YB%found loop -----循环读取数据。

dbms_output.put_line('人事部:‘emp_row.var_name||'工资:'emp_row.var_sal  );

FETCH CUR_YB  INTO emp_row;------将游标读取到下一行数据中。并且存储至emp_row。

end  loop;

CLOSE CUR_YB ; ---结束游标

end;

三.游标变量

1.声明游标变量的语法。

TYPE 游标变量类型名称  IS REF  CURSOR 数据类型。

2.打开游标变量。

OPEN 游标变量 FOR select语句;

3.读取和关闭与静态一样

FETCH 游标名称  INTO {RECORD变量}。

CLOSE 游标名称。

4.实列。

DECLARE TYP REC_EMP IS REF RECORD RETURN emp%rowtype----声明游标类型

emp_row  REC_EMP ;---声明游标变量emp_row

empROW emp%rowtype;------声明一个行记录变量类型。

begin

OPEN emp_row FOR  select * from emp where dep='人事部';;

FETCH emp_row INTO empROW ;-------首先使游标读取到查询的第一行数据。并且存储至emp_row。

while emp_row %found loop -----循环读取数据。

dbms_output.put_line('人事部:‘empROW .name||'工资:'empROW .sal  );

FETCH emp_row INTO empROW ------将游标读取到下一行数据中。并且存储至emp_row。

end  loop;

CLOSE emp_row ; ---结束游标

end;

四.用FOR循环遍历游标

1.隐式遍历

FOR 变量名称 IN (select语句) loop

end loop;

1.1 实列

begin

FOR emp_row IN (select * from emp where dep='人事部') loop ---隐式读取数据

dbms_output.put_line('人事部:‘emp_row .name||'工资:'emp_row .sal  );

end loop;

end;

2.显示遍历

FOR RECORD类型变量 IN 游标名称  LOOP

END LOOP;

2.1实列

DECLARE CURSOR cur_emp IS select * from emp where dep='人事部';

begin

FOR emp_row IN cur_emp LOOP

dbms_output.put_line('人事部:‘emp_row .name||'工资:'emp_row .sal  );

END LOOP;

end;

 

 

----------------小尾巴分割----------------------------------------

菜鸟的记录也是进步~如果对你有所帮助,那就点赞一下吧。-----来自没有代码的程序员小萝卜

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值