plsql编程中游标的使用

游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。

oracle中显示使用游标一般要包含以下5个步骤:

  • 声明一些变量以便存储从游标返回的值。
  • 声明游标,并指定查询。
  • 打开游标。
  • 遍历游标并取得数据。
  • 关闭游标

表结构及数据如下:

 1 -- Create table
 2 create table EXCHANGETIME
 3 (
 4   ID          NUMBER(18) default 0 not null,
 5   SYSTEM_TYPE CHAR(1) default ‘ ‘ not null,
 6   TIME_KIND   NUMBER(10) default 0 not null,
 7   TIME_NAME   VARCHAR2(16) default ‘ ‘ not null,
 8   BEGIN_TIME  NUMBER(10) default to_number(to_char(sysdate,‘hh24miss‘)) not null,
 9   END_TIME    NUMBER(10) default to_number(to_char(sysdate,‘hh24miss‘)) not null
10 )
11
12 insert into EXCHANGETIME (ID, SYSTEM_TYPE, TIME_KIND, TIME_NAME, BEGIN_TIME, END_TIME)
13 values (1, ‘0‘, 0, ‘上午交易时间‘, 91500, 113000);
14
15 insert into EXCHANGETIME (ID, SYSTEM_TYPE, TIME_KIND, TIME_NAME, BEGIN_TIME, END_TIME)
16 values (2, ‘0‘, 1, ‘下午交易时间‘, 130000, 150000);
17
18 insert into EXCHANGETIME (ID, SYSTEM_TYPE, TIME_KIND, TIME_NAME, BEGIN_TIME, END_TIME)
19 values (3, ‘1‘, 2, ‘盘后交易时间‘, 150000, 153000);
 1 -- Create table
 2 create table BACKUPINFO
 3 (
 4   ID         NUMBER(18) default 0 not null,
 5   INIT_DATE  NUMBER(10) default to_number(to_char(sysdate,‘yyyymmdd‘)) not null,
 6   TREAT_FLAG VARCHAR2(120) default ‘ ‘ not null,
 7   ERROR_INFO VARCHAR2(4000) default ‘ ‘ not null,
 8   FLAG       CHAR(1) default ‘ ‘ not null
 9 )
10
11 insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
12 values (1, 20140923, ‘1‘, ‘343%3r3‘, ‘2‘);
13
14 insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
15 values (2, 19900909, ‘4‘, ‘fr454‘, ‘ ‘);
16
17 insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
18 values (1, 20140923, ‘1‘, ‘343%3r3‘, ‘2‘);
19
20 insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
21 values (2, 19900909, ‘4‘, ‘fr454‘, ‘ ‘);
22
23 insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
24 values (1, 20140923, ‘1‘, ‘343%3r3‘, ‘2‘);
25
26 insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
27 values (2, 19900909, ‘4‘, ‘fr454‘, ‘ ‘);
28
29 insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
30 values (1, 20140923, ‘1‘, ‘343%3r3‘, ‘2‘);
31
32 insert into backupinfo (ID, INIT_DATE, TREAT_FLAG, ERROR_INFO, FLAG)
33 values (2, 19900909, ‘4‘, ‘fr454‘, ‘ ‘);

下面来看几个例子:

1. 完整的示例:

 1 declare
 2   --声明变量(用于存放游标查询出来的值)
 3   id exchangetime.id%type;
 4   system_type exchangetime.system_type%type;
 5   time_kind exchangetime.time_kind%type;
 6   time_name exchangetime.time_name%type;
 7   begin_time exchangetime.begin_time%type;
 8   end_time exchangetime.end_time%type;
 9
10   --声明游标
11   cursor v_eq is select * from exchangetime;
12 begin
13   --打开游标
14   open v_eq;
15
16   loop
17     --从游标中取出每行数据赋给上面定义的变量并打印出来
18     fetch v_eq into id, system_type, time_kind, time_name, begin_time, end_time;
19     dbms_output.put_line(id || ‘ ‘ || system_type|| ‘time_kind:‘ || time_kind || ‘ time _name:‘ || time_name || ‘ ‘ || begin_time || ‘-->‘ || end_time);
20
21     exit when v_eq%NOTFOUND;
22   end loop;
23
24   --关闭游标
25   close v_eq;
26
27 end;
28 /

输出结果:
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循环联合使用(推荐用法)

1 declare
2 begin
3   --mcursor的名字可以随便定义,aa或者bb都行,这样写的好处是不用显示定义游标,打开游标循环取值再关闭游标,很方便。
4  for mcursor in (select * from exchangetime) loop
5    dbms_output.put_line(mcursor.id || mcursor.time_name);
6  end loop;
7
8 end;
9 /

结果如下:

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.无约束游标:前面的游标都有返回类型称为约束游标,约束游标的返回类型必须与游标运行时查询中的列相匹配。无约束游标没有返回类型因此可以运行任何查询。

 1 declare
 2   --定义游标指针
 3   type t_cursor is ref cursor;
 4   --定义接收返回值的变量
 5   v_etresult exchangetime%rowtype;
 6   v_buresult backupinfo%rowtype;
 7   --相当于定义了一个指针变量
 8   v_cursor t_cursor;
 9 begin
10   --将指针并指向一个游标并打开
11   open v_cursor for select * from exchangetime t where t.id<3;
12
13   loop
14     --指向的游标里面每一行的值赋给接收的变量,并打印出来
15     fetch v_cursor into v_etresult;
16     dbms_output.put_line(v_etresult.time_name);
17     exit when v_cursor%notfound;
18   end loop;
19   --关闭指向的游标
20   close v_cursor;
21
22   --将指针指向另外一个游标并打开
23    open v_cursor for select * from backupinfo t;
24
25    loop
26      --指向的游标里面每一行的值赋给接收的变量,并打印出来
27     fetch v_cursor into v_buresult;
28     dbms_output.put_line(v_buresult.flag|| ‘--‘ || v_buresult.init_date);
29     exit when v_cursor%notfound;
30    end loop;
31
32
33   --关闭指针指向的游标
34   close v_cursor;
35 end;
36 /

结果如下:
    上午交易时间
    下午交易时间
    下午交易时间
    2--20140923
     --19900909
    2--20140923
      --19900909
    2--20140923
      --19900909
    2--20140923
      --19900909
      --19900909

时间: 2024-08-27 08:17:11

plsql编程中游标的使用的相关文章

Mysql中游标的使用

最近在使用Mysql时,经常需要用到游标,所以将使用方法做下记录以备日后查看.(这里只是为了说明游标的用法,不会涉及复杂的业务逻辑,所以举的例子可能并不恰当) 首先,创建两张表departmentinfo(部门信息表)和employeeinfo(员工信息表) 表结构如下: 表departmentinfo存储部门名及部门总销售额 表employeeinfo存储员工名.员工所在部门ID及员工个人销售额 表中初始数据如下: 各部门总销售额均为0 员工分别在3个部门下,且都有自己的销售额 然后创建存储过

SQL中游标的使用(转)

一般情况下,我们用SELECT这些查询语句时,都是针对的一行记录而言,如果要在查询分析器中对多行记录(即记录集)进行读取操作时,则需要使用到游标或WHILE等循环 游标的类型:  1.静态游标(不检测数据行的变化)  2.动态游标(反映所有数据行的改变)  3.仅向前游标(不支持滚动)  4.键集游标(能反映修改,但不能准确反映插入.删除) 游标使用顺序:   1.定义游标   2.打开游标   3.使用游标   4.关闭游标   5.释放游标 Transact-SQL:declare 游标名

SQL Server 中游标的使用

1.游标是行读取,占用资源比sql多2.游标的使用情景:  ->现存的系统中使用的是游标,查询必须通过游标来实现  ->用尽了while.子查询临时表.表变量.自定义函数以及其他方式仍然无法实现的时候,使用游标3.T-SQL 中游标的生命周期由5部分组成   ->定义游标:游标的定义遵循T-Sql的定义方法,赋值有两种方法,定义时赋值,和先定义后赋值,定义游标像定义其他局部变量一样前面要加@,注意如果是全局的游标,只支持定义时直接赋值,并且不能在游标前面加@   --定义时直接赋值   

plsql编程

一.plsql编程 oracle中所拥有的一种编程语言,功能强大 二.存储过程procedure 1.创建存储过程语法 CREATE [OR REPLACE] PROCEDURE pname [ (paramName1 [mode1] type1, param2 [mode2] type2, -)] ename in varchar2, job out varchar2, sal in out number IS | AS [变量定义声明部分,如: 变量1 INTEGER :=0; 变量2 DA

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

异常处理: 即使良好的PL-SQL程序也会遇到错误或者未预料的事件,一个优秀的程序都应该能够处理各种出错情况,尽可能的从错误中恢复.程序在运行时出现的错误成为异常.发生异常后,语句讲终止执行,PLSQL会立即将控制权交给PLSQL异常处理部分.Oracle中使用EXCEPTION来处理异常,一般有3种异常错误. 有三种类型的异常错误: 1. 预定义 ( Predefined )错误 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. 2

PLSQL编程面向对象的操作

1)了解对象类型组成及其组成部分的作用 2)建立简单的对象类型,并使用 3)建立复杂的对象类型,并使用 4)学会建立参照对象类型,并使用 一.对象类型是用户自定义的一种复合数据类型,封装了数据结构和数据结构的过程和函数,为了描述显示世界对象所抽象出来的具体特征,既有属性又有方法,应该涵盖对象所具有的公共特性,如每个雇员都有编码,姓名,工资,所以定义employee_type类型时就应该包含这些特征,对象实例是对象类型的具体实现,就是根据模型抽象出一个具体的东西,模型造了一辆汽车. 如雇员scot

SQL中游标的用法

游标:是用来对表从上下每行循环取值,将值连接成为字符串.例子:对 pubs 数据库的dbo.titles 表.1.取得表中的总价格:select sum(price) from dbo.titles2.但是我想得到这样一个结果:书名,价格.精通ASP,39元:学习vc++,28元:JAVA编程,23元则用到游标: 声明游标:declare titprice CURSOR FAST_FORWARD forselect title, price from dbo.titles where price

oracle存储过程中游标的使用

一. 使用for循环游标: 1. 定义游标(游标就是一个小集合) 2. 定义游标变量 3. 使用for循环游标 declare -- 定义游标c_job cursor c_job is select empno, ename, job, sal from emp where job = 'MANAGER'; -- 定义游标变量c_row c_row c_job%rowtype; begin -- 循环游标,用游标变量c_row存循环出的值 for c_row in c_job loop dbms

mysql中游标的使用案例详解(学习笔记)

1.游标是啥玩意?简单的说:游标(cursor)就是游动的标识,啥意思呢,通俗的这么说,一条sql取出对应n条结果资源的接口/句柄,就是游标,沿着游标可以一次取出一行.我给大家准备一张图: 2.怎么使用游标?//1.声明/定义一个游标declare 声明;declare 游标名 cursor for select_statement;//2.打开一个游标open 打开;open 游标名//3.取值fetch 取值;fetch 游标名 into var1,var2[,...]//4.关闭一个游标c