设为首页 加入收藏

TOP

oracle cursor (游标)(一)
2014-11-24 00:57:19 来源: 作者: 【 】 浏览:17
Tags:oracle cursor 游标

Sql代码

--ref 游标

/*

显示游标 多行

隐含游标 数据操纵语言DML 和单行select into语句

1.定义游标

指定游标所对应的select结果集语句

CURSOR cursor_name IS select_statement;

select_statement:查询语句

2.打开游标

OPEN cursor_name;

执行游标所对应的select_statement,将结果暂时存放在游标结果集中

3.提取数据

使用fetch语句提取游标数据,fetch每次只能提取一行;fetch..bulk collect into可以提取多行

FETCH cursor_name into variable...;

variable 接受游标数据的变量

FETCH cursor_name BULK COLLECT INTO collection...;

collection 接收游标数据的集合变量

4.关闭游标

提取完数据,关闭游标,释放结果集

CLOSE cursor_name;

*游标属性

cursor_name%ISOPEN 游标是否已打开

cursor_name%FOUND FETCH语句执行后,用来判断是否有数据被提取

cursor_name%NOTFOUND 同上

cursor_name%ROWCOUNT 目前已经fetch的行数

*/

--隐含游标

DECLARE

v_name varchar2(30);

BEGIN

select ename into v_name from emp where empno = 7788;

CASE

WHEN SQL%FOUND THEN

dbms_output.put_line('隐身游标的行数肯定是:'||SQL%ROWCOUNT||',查询的结果:'||v_name);

--隐身游标的行数肯定是:1,查询的结果:SCOTT

END CASE;

END;

--显示游标

--fetch提取一行数据

DECLARE

CURSOR emp_cs is select ename,job from emp;--声明游标

v_name emp.ename%type;

v_job emp.job%type;

BEGIN

OPEN emp_cs;

LOOP--因为fetch只提取一条数据,所以用循环多次提取

FETCH emp_cs INTO v_name,v_job;

EXIT WHEN emp_cs%NOTFOUND;--当游标中没有数据时,退出循环

dbms_output.put_line(emp_cs%ROWCOUNT||'--'||v_name||'--'||v_job);

END LOOP;

CLOSE emp_cs;

END;

--FETCH ...BULK COLLECTION 提取多行数据

DECLARE

--声明存储多行数据的集合类型

TYPE v_table_type IS TABLE OF VARCHAR2(30);

name_table v_table_type;

job_table v_table_type;

CURSOR emp_cs IS select ename,job from emp;

BEGIN

OPEN emp_cs;

FETCH emp_cs BULK COLLECT INTO name_table,job_table; --两个嵌套表类型不需要初始化

FOR i IN 1..name_table.count LOOP

dbms_output.put_line(name_table(i)||'--'||job_table(i));

END LOOP;

CLOSE emp_cs;

END;

--分页提取,每次提取固定条数

DECLARE

type v_table_type IS TABLE OF int;

no_tab v_table_type;

pageNo int :=5;--5条一页

nums int:=0;--已经输出的条数

CURSOR emp_cs IS select empno from emp;

BEGIN

--OPEN emp_cs;

IF NOT emp_cs%ISOPEN THEN

OPEN emp_cs;

END IF;

LOOP--LIMIT语句限制每次提请的条数,从上次游标rowcount处开始

FETCH emp_cs BULK COLLECT INTO no_tab LIMIT pageNo;

--打印刚获取的数据(5条),右边界计算方法:游标总共fetch的条数-已经输出的条数

FOR I IN 1..(emp_cs%ROWCOUNT - nums) LOOP

dbms_output.put_line(no_tab(i));

END LOOP;

dbms_output.new_line;

nums := emp_cs%ROWCOUNT;--从新设置已输出的条数

/*

--这一句放到最后,因为知道emp表中共有14条记录,可以分为3页,第3次Fecth只有4条数据,

--这时候已经是NOTFOUND了,如果放到输出前面的话,后4条就不能被输出了

*/

EXIT WHEN emp_cs%NOTFOUND;

END LOOP;

CLOSE emp_cs;

END;

--游标 记录变量

DECLARE

CURSOR emp_cs IS select ename,job from emp;

v_record emp_cs%ROWTYPE;--游标行类型定义record

BEGIN

OPEN emp_cs;

LOOP

FETCH emp_cs INTO v_record;

EXIT WHEN emp_cs%NOTFOUND;

dbms_output.put_line(v_record.ename||'--'||v_record.job);

END LOOP;

CLOSE emp_cs;

END;

--参数游标 就是差不多相当与函数了 根据不同的参数值有不同的游标数据

--参数一般会在游标的select语句中使用,否则也就没意义了

/*

CURSOR cursor_name(parametr_name datatype...) IS select_

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

评论

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