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 ...
随机推荐
- swf上传
swfupload多文件异步上传 多文件选择异步上传的原理 传统上:多个文件逐一选.PHP开始处理,循环上 PHP+Flash上:JS调用flash控,Flash批量选取并保持选取所有文件列 swfu ...
- js 邮箱正则匹配
$(function(){ var valAttr = '746979855qq.com'; \-])+\.)+([a-zA-Z0-]{,})+$/; var tmpresult = mail_fil ...
- 关于多本小说站的SEO—从”易读中文网”获得的心得体会
从目前国内的网站流量来说,电影站,小说站,游戏站等的流量占总流量的比例还是很高的,许多站长把目光投入到了这几个方面,本文就着重来说对于小说站,尤其是多本小说站的SEO心得体会! 对于小说站来说,只要排 ...
- Windows10 删除已经保存的WIFI热点
自己的笔记本很多时候都是连接WIFI上网,导致保存的WIFI越来越多,有些都过期不能用了,但还是在列表中存在着,致使列表很长很难看,如下: 删除无用热点的方法如下: win+r运行cmd,进入命令行界 ...
- 存储过程中update,然后用sql%判断update是否成功的存储过程
--更新用户状态 PROCEDURE P_UPDATE_USER_STATUS ( v_SrcID IN NUMERIC, v_DstID IN NUMERIC, v_DstType IN NUMER ...
- 监视系统3389的VBS脚本
Title: 监视系统3389的VBS脚本 --2010-10-27 19:56 从网上找的,不知道是不是NP写的那个 ---------------------------------------- ...
- spark1.1.0源码阅读-dagscheduler and stage
1. rdd action ->sparkContext.runJob->dagscheduler.runJob def runJob[T, U: ClassTag]( rdd: RDD[ ...
- 将Altium中的原理图与PCB导出为PDF的步骤与方法
1.通过File-Smart PDF(文件-智能PDF),快捷键F-M打开. 2.选择打印的范围:Current Project还是Current Document,还有生成的PDF的存放位置. 3. ...
- 关于 "Context" 模式(基于COM思想IUnknown思想)
有同事很喜欢用Context模式,觉得是自己"首创", 我有些自己的想法, 或者大家可以发表下自己的观点. 什么是Context模式? 23种设计模式中没有这个模式, 是同事自 ...
- 通过JS触发TextBox的ontextchanged事件,并获取TextBox所在GridView的那一行
protected void txtInsNum_TextChanged(object sender, EventArgs e) { TextBox t = (TextBox)sender; Grid ...