plsql编程中游标的使用
游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。
oracle中显示使用游标一般要包含以下5个步骤:
- 声明一些变量以便存储从游标返回的值。
- 声明游标,并指定查询。
- 打开游标。
- 遍历游标并取得数据。
- 关闭游标
表结构及数据如下:
-- Create table
create table EXCHANGETIME
(
ID NUMBER(18) default 0 not null,
SYSTEM_TYPE CHAR(1) default ' ' not null,
TIME_KIND NUMBER(10) default 0 not null,
TIME_NAME VARCHAR2(16) default ' ' not null,
BEGIN_TIME NUMBER(10) default to_number(to_char(sysdate,'hh24miss')) not null,
END_TIME NUMBER(10) default to_number(to_char(sysdate,'hh24miss')) not null
) insert into EXCHANGETIME (ID, SYSTEM_TYPE, TIME_KIND, TIME_NAME, BEGIN_TIME, END_TIME)
values (1, '', 0, '上午交易时间', 91500, 113000); insert into EXCHANGETIME (ID, SYSTEM_TYPE, TIME_KIND, TIME_NAME, BEGIN_TIME, END_TIME)
values (2, '', 1, '下午交易时间', 130000, 150000); insert into EXCHANGETIME (ID, SYSTEM_TYPE, TIME_KIND, TIME_NAME, BEGIN_TIME, END_TIME)
values (3, '', 2, '盘后交易时间', 150000, 153000);
-- Create table
create table BACKUPINFO
(
ID NUMBER(18) default 0 not null,
INIT_DATE NUMBER(10) default to_number(to_char(sysdate,'yyyymmdd')) not null,
TREAT_FLAG VARCHAR2(120) default ' ' not null,
ERROR_INFO VARCHAR2(4000) default ' ' not null,
FLAG CHAR(1) default ' ' not null
) insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
values (1, 20140923, '', '343%3r3', ''); insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
values (2, 19900909, '', 'fr454', ' '); insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
values (1, 20140923, '', '343%3r3', ''); insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
values (2, 19900909, '', 'fr454', ' '); insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
values (1, 20140923, '', '343%3r3', ''); insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
values (2, 19900909, '', 'fr454', ' '); insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
values (1, 20140923, '', '343%3r3', ''); insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
values (2, 19900909, '', 'fr454', ' ');
下面来看几个例子:
1. 完整的示例:
declare
--声明变量(用于存放游标查询出来的值)
id exchangetime.id%type;
system_type exchangetime.system_type%type;
time_kind exchangetime.time_kind%type;
time_name exchangetime.time_name%type;
begin_time exchangetime.begin_time%type;
end_time exchangetime.end_time%type; --声明游标
cursor v_eq is select * from exchangetime;
begin
--打开游标
open v_eq; loop
--从游标中取出每行数据赋给上面定义的变量并打印出来
fetch v_eq into id, system_type, time_kind, time_name, begin_time, end_time;
dbms_output.put_line(id || ' ' || system_type|| 'time_kind:' || time_kind || ' time _name:' || time_name || ' ' || begin_time || '-->' || end_time); exit when v_eq%NOTFOUND;
end loop; --关闭游标
close v_eq; end;
/
输出结果:
1 0time_kind:0 time _name:上午交易时间 91500-->113000
2 0time_kind:1 time _name:下午交易时间 130000-->150000
3 1time_kind:2 time _name:盘后交易时间 150000-->153000
3 1time_kind:2 time _name:盘后交易时间 150000-->153000
2. 与for循环联合使用(推荐用法)
declare
begin
--mcursor的名字可以随便定义,aa或者bb都行,这样写的好处是不用显示定义游标,打开游标循环取值再关闭游标,很方便。
for mcursor in (select * from exchangetime) loop
dbms_output.put_line(mcursor.id || mcursor.time_name);
end loop; end;
/
结果如下:
1上午交易时间
2下午交易时间
3盘后交易时间
3.使用open ... for ...语句
1 declare
2 --定义游标指针并指定返回类型为exchangetime的所有列
3 type t_cursor is ref cursor return exchangetime%rowtype;
4 --定义接收返回值的变量
5 v_etresult exchangetime%rowtype;
6 --相当于定义了一个指针变量
7 v_cursor t_cursor;
8 begin
9 --将指针并指向一个游标并打开
10 open v_cursor for select * from exchangetime t where t.id<3;
11
12 loop
13 -- --指向的游标里面每一行的值赋给接收的变量,并打印出来
14 fetch v_cursor into v_etresult;
15 dbms_output.put_line(v_etresult.time_name);
16 exit when v_cursor%notfound;
17 end loop;
18 --关闭指向的游标
19 close v_cursor;
20
21 --将指针指向另外一个游标并打开
22 open v_cursor for select * from exchangetime t;
23
24 loop
25 fetch v_cursor into v_etresult;
26 dbms_output.put_line(v_etresult.time_name|| '--' || v_etresult.system_type);
27 exit when v_cursor%notfound;
28 end loop;
29
30
31 --关闭指针指向的游标
32 close v_cursor;
33 end;
34 /
结果如下:
上午交易时间
下午交易时间
下午交易时间
上午交易时间--0
下午交易时间--0
盘后交易时间--1
盘后交易时间--1
4.无约束游标:前面的游标都有返回类型称为约束游标,约束游标的返回类型必须与游标运行时查询中的列相匹配。无约束游标没有返回类型因此可以运行任何查询。
declare
--定义游标指针
type t_cursor is ref cursor;
--定义接收返回值的变量
v_etresult exchangetime%rowtype;
v_buresult backupinfo%rowtype;
--相当于定义了一个指针变量
v_cursor t_cursor;
begin
--将指针并指向一个游标并打开
open v_cursor for select * from exchangetime t where t.id<3; loop
--指向的游标里面每一行的值赋给接收的变量,并打印出来
fetch v_cursor into v_etresult;
dbms_output.put_line(v_etresult.time_name);
exit when v_cursor%notfound;
end loop;
--关闭指向的游标
close v_cursor; --将指针指向另外一个游标并打开
open v_cursor for select * from backupinfo t; loop
--指向的游标里面每一行的值赋给接收的变量,并打印出来
fetch v_cursor into v_buresult;
dbms_output.put_line(v_buresult.flag|| '--' || v_buresult.init_date);
exit when v_cursor%notfound;
end loop; --关闭指针指向的游标
close v_cursor;
end;
/
结果如下:
上午交易时间
下午交易时间
下午交易时间
2--20140923
--19900909
2--20140923
--19900909
2--20140923
--19900909
2--20140923
--19900909
--19900909
plsql编程中游标的使用的更多相关文章
- 6、plsql编程
一.PLSQL编程思维导图 二.PLSQL编程思维导图对应笔记 PL/SQL编程 @Holly老师 5.1 为什么学习PL/SQL编程? 当我们要批量插入100万数据,怎么办? .难道要写一百条ins ...
- Oracle总结之plsql编程(基础七)
紧接基础六,对oracle角色和权限的管理之后,在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结,和大家分享! 原创作品,转自请注明出处:https://www.cnblogs ...
- Oracle存储过程中游标的简单使用
存储过程中查询语句如何返回多行结果? 我们知道,如果存储过程中查询语句有多行结果输出,会报错:ORA-01422: exact fetch returns more than requested nu ...
- Oracle数据库DDL,DML,视图,PLSQL编程
动手敲~~~ --创建一个表空间--beijing create tablespace beijing datafile 'c:\beijing.dbf' size 100m autoextend o ...
- Oracle数据库PLSQL编程和存储过程
一.PLSQL编程 1.1.使用PLSQL实现 Hello world! 1 -- Created on 2022/8/22 by ADMINISTRATOR 2 declare 3 -- 这是申明变 ...
- Oracle基础 PL-SQL编程基础(4) 异常处理
异常处理: 即使良好的PL-SQL程序也会遇到错误或者未预料的事件,一个优秀的程序都应该能够处理各种出错情况,尽可能的从错误中恢复.程序在运行时出现的错误成为异常.发生异常后,语句讲终止执行,PLSQ ...
- Oracle基础 PL-SQL编程基础(1) 变量和常量
一.什么是PL-SQL PL-SQL是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言.具体来说,PL-SQL就是在普通的SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句 ...
- PLSQL编程基础
一 PL/SQL简介 1 SQL:结构化的查询语句 2 PL/SQL优点与特性: 提高运行效率==>>提高运行效率的其他方式(存储过程,分页,缓存,索引) 模块化设计 允许定义标识符(变量 ...
- SQL中游标的用法
游标:是用来对表从上下每行循环取值,将值连接成为字符串.例子:对 pubs 数据库的dbo.titles 表.1.取得表中的总价格:select sum(price) from dbo.titles2 ...
随机推荐
- 工作流activiti-01个人小结
最近公司需要开发工作流 使用的是activiti 个人拿着官方的User Guide 摸索了好几天 现做个小结: 对公司的小型OA开发一般用到如下几点: 1.依据客户业务得到业务流程图 可以是xm ...
- MySQL如何执行关联查询
MySQL中‘关联(join)’ 一词包含的意义比一般意义上理解的要更广泛.总的来说,MySQL认为任何一个查询都是一次‘关联’ --并不仅仅是一个查询需要到两个表的匹配才叫关联,索引在MySQL中, ...
- javaScript的select元素和option的相关操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Nginx源码研究二:NGINX的事件处理概论
NGINX作为服务端的应用程序,在客户端发出数据后,服务端在做着这样一些处理,数据先会经过网卡,网卡会和操作系统做交互,经过操作系统的协议栈处理,再和不同的应用程序交互. 在这里面涉及两个概念,一个是 ...
- 统计建模与R软件习题二答案
# 习题2 # 2.1 x=c(1,2,3) y=c(4,5,6) e=c(rep(1,3)) z=2*x+y+e;z x%*%y # 若x,y如答案那样定义为矩阵,则不能用%*%,因为,维数不对应, ...
- nodejs 在headers添加内容发送到后端
app.all('*', function(req, res, next){ req.headers['COOKIE'] = 'Your Cookie' next() })
- 转:分享13款PHP开发框架
文章来自于:http://mashable.com/2014/04/04/php-frameworks-build-applications/ Building software applicatio ...
- hibernate 映射<四>多对一双向映射
学生和班级的例子来说,多个学生可以对应一个班级. 1.站在学生角度来说,学生就是多端.那么我们可以通过多对一来维护2者的关系. 2.站在班级的角度来说,班级就是一端.那么我们可以通过一对多啦维护2者的 ...
- 关于Python中的for循环控制语句
#第一个:求 50 - 100 之间的质数 import mathfor i in range(50, 100 + 1): for j in range(2, int(math.sqrt(i)) ...
- 你需要知道的九大排序算法【Python实现】之快速排序
五.快速排序 基本思想: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: #coding: ...