首页 > 代码库 > plsql编程中游标的使用

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 null10 )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 begin13   --打开游标14   open v_eq;15   16   loop17     --从游标中取出每行数据赋给上面定义的变量并打印出来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 declare2 begin3   --mcursor的名字可以随便定义,aa或者bb都行,这样写的好处是不用显示定义游标,打开游标循环取值再关闭游标,很方便。4  for mcursor in (select * from exchangetime) loop5    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   loop13     -- --指向的游标里面每一行的值赋给接收的变量,并打印出来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    loop25     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 begin10   --将指针并指向一个游标并打开11   open v_cursor for select * from exchangetime t where t.id<3;12   13   loop14     --指向的游标里面每一行的值赋给接收的变量,并打印出来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    loop26      --指向的游标里面每一行的值赋给接收的变量,并打印出来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

 

plsql编程中游标的使用