设为首页 加入收藏

TOP

oracle cursor (游标)(二)
2014-11-24 00:57:19 来源: 作者: 【 】 浏览:18
Tags:oracle cursor 游标
statement;

*参数只能定义类型,不能定义长度,

*/

DECLARE

CURSOR emp_cs(param1 varchar2) IS select ename from emp where job =param1;

v_name emp.ename%type;

v_job varchar2(30) := '&job';

BEGIN

OPEN emp_cs(v_job);

LOOP

FETCH emp_cs INTO v_name;

EXIT WHEN emp_cs%NOTFOUND;

dbms_output.put_line(v_name);

END LOOP;

CLOSE emp_cs;

END;

--使用游标更新或删除数据

/*

游标不仅可以查询数据,也可以修改数据,由于游标是操作的多条数据更新,为

保证事物的原子性,我也不知道怎么称呼,反正就是防止游标中的数据行在修改的过程中

有其它的事务修改这些列 要使用FOR UPDATE 子句

如:游标中有5条数据,你这时正执行修改第3条数据,而这时另一个事务修改了第4条数据。

而游标是临时缓存结果集,4的修改就不会被看到。这样就乱套了

CURSOR cursor_name(param datatype) IS

select_statement FOR UPDATE [OF column_reference][NOWAIT];

FOR UPDATE在游标结果集数据行上加行共享锁,防止其它用户在相应

行上执行DML操作。

*/

DECLARE

CURSOR emp_cs IS select comm from emp FOR UPDATE;

v_comm number(7,2);

BEGIN

OPEN emp_cs;

LOOP

FETCH emp_cs INTO v_comm;

EXIT WHEN emp_cs%NOTFOUND;

IF v_comm is null THEN

UPDATE emp SET comm=1 WHERE CURRENT OF emp_cs;

END IF;

END LOOP;

CLOSE emp_cs;

END;

commit;

/*

游标for循环

简化了对游标的处理,使用游标for循环时,oracle会隐含的打开游标、

提取数据并关闭游标

*/

--1

DECLARE

CURSOR emp_cs IS select ename,job from emp;

BEGIN

FOR emp_record IN emp_cs LOOP--emp_record是隐含定义的记录变量名

dbms_output.put_line(emp_cs%ROWCOUNT||'-'||emp_record.ename);

END LOOP;

END;

--2 在游标for循环中直接是哦那个select语句定义游标

--不过这样就不能使用游标属性了,因为没有游标名字

BEGIN

FOR emp_record IN (select ename,job from emp) LOOP

dbms_output.put_line(emp_record.ename);

END LOOP;

END;

/*

使用游标变量

使用显示游标时,需要在定义部分指定所对应的静态select语句;

当使用游标变量时,就可在打开游标变量时指定其所对应的select语句。

定义游标变量

TYPE ref_type IS REF CURSOR[RETURN return_type];

cursor_var ref_type;

*/

--exp1

DECLARE

TYPE emp_cursor_type IS REF CURSOR; --定义一个游标变量类型

emp_cs emp_cursor_type;--使用这个游标类型定义一个游标变量

emp_record emp%ROWTYPE;

BEGIN

OPEN emp_cs FOR select * from emp;--打开游标变量时指定其所对应的select语句

LOOP

FETCH emp_cs INTO emp_record;--取数据就和普通的游标一样了

EXIT WHEN emp_cs%NOTFOUND;

dbms_output.put_line(emp_record.ename);

END LOOP;

CLOSE emp_cs;

END;

--exp2 定义游标变量是指定返回类型(智能是record)

DECLARE

TYPE v_record_type IS RECORD(

name varchar2(10),sal number

);

TYPE v_cursor_type IS REF CURSOR RETURN v_record_type;--返回上面定义的record类型

--声明一个record变量,一个cursor变量

v_record v_record_type;

v_cursor v_cursor_type;

BEGIN

OPEN v_cursor FOR select ename,sal from emp where deptno=10;

LOOP

FETCH v_cursor INTO v_record;

EXIT WHEN v_cursor%NOTFOUND;

dbms_output.put_line(v_record.name||'-'||v_record.sal);

END LOOP;

CLOSE v_cursor;

END;

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据库基础之“索引” 下一篇8天学通MongoDB――第一天 基础入..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: