游标(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. thinkphp基础入门(2)

    第一节介绍了thinkphp基本路径问题,第二节将介绍thinkphp的常见用法(M层跟V层) 我们先在Controller层新建个IndexController.class.php(新建文件的格式为 ...

  2. ECSTORE 关于前台页面DIALOG的调用

    在需调用dialog的html页面中插入本段代码. link='<{link app=test ctl=site_test act=abc}>'; var dialog = new Dia ...

  3. arclist标签和list标签区别

    很多站长朋友在刚入门织梦的时候对织梦的标签存在很多的困惑,关于arclist标签和list标签,甚至不知道啥时候用arclist,啥时用list标签.arclist 为自由列表,全局模板中都生效,一般 ...

  4. 2016年9月3日 文成小盆友python-num18 - django进阶一

    一.深入django的路由系统 下面为django的请求生命周期 下面来看下整个生命周期中的路由系统: 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规则如下: " ...

  5. 用TMS的控件就可以了,有bug叫他们改

    [深圳]大宝delphi本身不是太隐定.不建议弄太多自己的东西.还要debug好长时间.为了快.便不去弄控件了够用了.真的.都不用花太多时间去弄这弄那.有bug叫他们改便可以.

  6. Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)

    多重背包模板- #include <stdio.h> #include <string.h> int a[7]; int f[100005]; int v, k; void Z ...

  7. 【笔试&面试】C#中的程序集

    1.      C#中的程序集(Assembly) 答:程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分离可重用类型的逻辑表示和物理表示. 程序集是一个可重用.可实施版本策略和安全策略 ...

  8. java模拟http post

    我们将使用java.net.URLConnection来完成一次post请求,假设要post数据到http://localhost:8080/doSome上: URLConnection urlCon ...

  9. JS(七)

    JS又上完了,还是感觉JS技巧性很强,需要多积累经验...看了一下PHP的内容,感觉搭建环境好麻烦,结果回来下了个wamp感觉好像就可以了..... 1.红绿蓝颜色条: <!DOCTYPE ht ...

  10. error userinfo error pos 5 友盟分享 网页分享(无新浪微博客户端)

    集成友盟分享的时候,其中微博分享,如果没有添加测试账号,就会出现{error userinfo error pos  5}的错误添加测试账号才能分享在测试信息下添加测试账号