plsql 显式游标
2015-12-21 19:18
232 查看
显式游标的处理过程包括:
声明游标,打开游标,检索游标,关闭游标。
声明游标
CURSOR c_cursor_name IS statement;
游标相当于一个查询结果集,将查询的结果放在游标里,方便在块里进行处理。
记录
一个记录就是一个复合的数据结构,相当于结果集里的一行数据,用于遍历游标时存放结果。记录支持三种定义:基于表,基于游标,自定义。
如果是基于表或游标,其定义格式为:
record_name table_name or cursor_name%ROWTYPE;
打开游标
OPEN cursor_name;
检索游标
存在两种游标检索方式:
FETCH cursor_name INTO pl/sql variables;
or
FETCH cursor_name INTO pl/sql record;
当游标被检索时,在每个FETCH语句之后,活跃数据集指针继续迁移到下一个数据行。因此,FETCH会返回活跃数据集中连续的数据行,直到获取整个数据集。最后一个FETCH语句不会给输出变量赋值,后者仍旧保存原来的值。
那么在游标检索到最后,如何停止检索呢?
这时就要用到游标的属性了。
游标属性包括:
%NOTFOUND 当前的FETCH操作没有返回数据行时,为true,否则为false;
%FOUND 与上述相反;
%ROWCOUNT 返回游标的记录数量;
%ISOPEN 检测游标是否打开;
关闭游标
CLOSE cursor_name;
以下是一个示例:
简便的办法:使用游标 FOR循环
借助于游标FOR循环,游标打开,检索和关闭的过程都被隐含地实现。这使得代码块更容易编写与维护。
使用方法其实与C#中的foreach相似,自动遍历。
以下是上面示例的for循环写法:
传入参数
如果要传入参数,在游标名后面加上类似函数的参数列表之类的东西,在检索游标时相当于调用(即FETCH INTO语句),在游标名后面传入实际参数。
下面是一个示例:
七夕节快乐!大家要做好安全措施哦~~
声明游标,打开游标,检索游标,关闭游标。
声明游标
CURSOR c_cursor_name IS statement;
游标相当于一个查询结果集,将查询的结果放在游标里,方便在块里进行处理。
记录
一个记录就是一个复合的数据结构,相当于结果集里的一行数据,用于遍历游标时存放结果。记录支持三种定义:基于表,基于游标,自定义。
如果是基于表或游标,其定义格式为:
record_name table_name or cursor_name%ROWTYPE;
打开游标
OPEN cursor_name;
检索游标
存在两种游标检索方式:
FETCH cursor_name INTO pl/sql variables;
or
FETCH cursor_name INTO pl/sql record;
当游标被检索时,在每个FETCH语句之后,活跃数据集指针继续迁移到下一个数据行。因此,FETCH会返回活跃数据集中连续的数据行,直到获取整个数据集。最后一个FETCH语句不会给输出变量赋值,后者仍旧保存原来的值。
那么在游标检索到最后,如何停止检索呢?
这时就要用到游标的属性了。
游标属性包括:
%NOTFOUND 当前的FETCH操作没有返回数据行时,为true,否则为false;
%FOUND 与上述相反;
%ROWCOUNT 返回游标的记录数量;
%ISOPEN 检测游标是否打开;
关闭游标
CLOSE cursor_name;
以下是一个示例:
1 declare 2 cursor c_zip is 3 select * from zipcode;--声明游标 4 vr_zip c_zip%rowtype;--声明记录,结构基于游标 5 begin 6 open c_zip;--打开游标 7 loop 8 fetch c_zip into vr_zip;--循环,检索游标 9 exit when c_zip%NOTFOUND;--利用属性,当前一FETCH操作没有返回数据,exit 10 dbms_output.putline(vr_zip.zip || ' ' || vr_zip.city || ' ' || vr_zip.state); 11 end loop; 12 close c_zip;--关闭游标 13 end;
简便的办法:使用游标 FOR循环
借助于游标FOR循环,游标打开,检索和关闭的过程都被隐含地实现。这使得代码块更容易编写与维护。
使用方法其实与C#中的foreach相似,自动遍历。
以下是上面示例的for循环写法:
1 declare 2 cursor c_zip is 3 select * from zipcode;--声明游标 4 begin 5 for r_zip in c_zip--不必声明记录 6 loop 7 dbms_output.putline(vr_zip.zip || ' ' || vr_zip.city || ' ' || vr_zip.state); 8 end loop;--不必考虑何时退出 9 end;
传入参数
如果要传入参数,在游标名后面加上类似函数的参数列表之类的东西,在检索游标时相当于调用(即FETCH INTO语句),在游标名后面传入实际参数。
下面是一个示例:
1 declare 2 cursor c_zip(p_state in zipcode.state%type) is --传入参数 3 select zip, city, state 4 from zipcode 5 where state = p_state; 6 v_state zipcode.state%type := &a; 7 begin 8 for r_zip in c_zip(v_state)--调用时传入实际参数 9 loop 10 dbms_output.put_line(r_zip.zip || ', ' || r_zip.city || ', 4000 ' || r_zip.state); 11 end loop; 12 exception 13 when no_data_found then dbms_output.put_line('no data found'); 14 end;
七夕节快乐!大家要做好安全措施哦~~
相关文章推荐
- ora-04021:等待锁定对象时发生超时
- PL/SQL 异常的传播
- pl/sql 自学软件安装及配置
- 数据库字段顺序的【坑】
- nvl函数
- Mysql 数据库zip版安装时basedir datadir 路径设置问题,避免转义符的影响
- mysql处理高并发,防止库存超卖
- SQL server数据缓存依赖
- 用ISO文件以YUM方式安装ORACLE12C所需要的RPM
- cmd 到数据库时出现ORA-01658: 无法为表空间 DHCT中的段创建 INITIAL 区
- 防止SQL注入
- 数据库事务(Transaction)的ACID特性解释
- 分析Redis架构设计
- LoadRunner调用Oracle存储过程
- redis 主从模式
- Sqlmap注入技巧集锦
- PL/SQL 设置关键字大写
- SQL数据库出现的一些问题和在oracle数据库中的问题介绍
- ORA-04031:无法分配共享内存
- 数据库中''与null的区别