游标(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编程中游标的使用的更多相关文章

  1. 6、plsql编程

    一.PLSQL编程思维导图 二.PLSQL编程思维导图对应笔记 PL/SQL编程 @Holly老师 5.1 为什么学习PL/SQL编程? 当我们要批量插入100万数据,怎么办? .难道要写一百条ins ...

  2. Oracle总结之plsql编程(基础七)

    紧接基础六,对oracle角色和权限的管理之后,在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结,和大家分享! 原创作品,转自请注明出处:https://www.cnblogs ...

  3. Oracle存储过程中游标的简单使用

    存储过程中查询语句如何返回多行结果? 我们知道,如果存储过程中查询语句有多行结果输出,会报错:ORA-01422: exact fetch returns more than requested nu ...

  4. Oracle数据库DDL,DML,视图,PLSQL编程

    动手敲~~~ --创建一个表空间--beijing create tablespace beijing datafile 'c:\beijing.dbf' size 100m autoextend o ...

  5. Oracle数据库PLSQL编程和存储过程

    一.PLSQL编程 1.1.使用PLSQL实现 Hello world! 1 -- Created on 2022/8/22 by ADMINISTRATOR 2 declare 3 -- 这是申明变 ...

  6. Oracle基础 PL-SQL编程基础(4) 异常处理

    异常处理: 即使良好的PL-SQL程序也会遇到错误或者未预料的事件,一个优秀的程序都应该能够处理各种出错情况,尽可能的从错误中恢复.程序在运行时出现的错误成为异常.发生异常后,语句讲终止执行,PLSQ ...

  7. Oracle基础 PL-SQL编程基础(1) 变量和常量

    一.什么是PL-SQL PL-SQL是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言.具体来说,PL-SQL就是在普通的SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句 ...

  8. PLSQL编程基础

    一 PL/SQL简介 1 SQL:结构化的查询语句 2 PL/SQL优点与特性: 提高运行效率==>>提高运行效率的其他方式(存储过程,分页,缓存,索引) 模块化设计 允许定义标识符(变量 ...

  9. SQL中游标的用法

    游标:是用来对表从上下每行循环取值,将值连接成为字符串.例子:对 pubs 数据库的dbo.titles 表.1.取得表中的总价格:select sum(price) from dbo.titles2 ...

随机推荐

  1. Linux程序设计笔记

    使用size命令查看二进制文件时,结果并不一定和预测占用内存大小一致,因为可能存在内存对齐,导致内存字节数比实际的更多 在C语言中,字符串常量存放在text segment中,在C++中却是存储在da ...

  2. Rand

    我看了下网上,是这样的:rand()随机产生一个数(0-65535),加上%后,就是对其它数求余,求余产生的数取决于求余的数.比如,rand()%20;意思是利用rand()的返回值(一个0-6553 ...

  3. java反射 -Class类

    Class类:任何类都是Class类的对象 Class类的实例对象的三种表现形式:1.通过某个类的.class实现 2.某个类的对象的getClass()方法 3.Class.forName() 注意 ...

  4. IOS学习之十七:Grand Central Dispatch(GCD)编程基础

    IOS学习之十七:Grand Central Dispatch(GCD)编程基础   有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列, ...

  5. angularJs项目实战!04:angularjs的性能问题

    上一篇文章中我花了很多口舌去介绍angularjs是一个中型框架,面对大型应用时少不了第三方类库的配合.而我的核心议题是:如何以angularjs的思路使用其他类库,这里jquery是最好的例子了,谁 ...

  6. 转:perror和strerror的区别

    概述: perror和strerror都是C语言提供的库函数,用于获取与erno相关的错误信息,区别不大,用法也简单.最大的区别在于perror向stderr输出结果,而 strerror向stdou ...

  7. RAW碰到的问题与功能的测试

    碰到的问题太多: 1. 没人告诉我,应该在CreateFile之前,先InstallDriver2. 签名死活不行(好像是反斜杠问题)3. 注册码错误4. 怀疑ANSI与Unicode注册码的问题5. ...

  8. BZOJ1690: [Usaco2007 Dec]奶牛的旅行

    1690: [Usaco2007 Dec]奶牛的旅行 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 552  Solved: 286[Submit][St ...

  9. RSA实例破解

    Description: Decode the message. You intercept the following message, which you know has been encode ...

  10. Hadoop-2.x的源码编译

    由于在Hadoop-2.x中,Apache官网上提供的都是32位版本,如果是生产环境中则需要自行编译64位,编译Hadoop-2.x版本方法如下: 安装编译源码所依赖的底层库 yum install ...