`
liuguofeng
  • 浏览: 435685 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

oracle 游标以及游标变量(1)

阅读更多

ORACLE 游标

一. PL/SQL 是用游标来管理 SQL 的 SELECT 语句的 . 游标是为了处理这些语句而分配的一大块内存 . 它提供了对一个结果集进行逐行处理的能力 , 可看作是一种特殊的指针 . 它与某个查询结果集相关联 , 可以指向结果集的任意位置 , 以便对指定位置的数据进行处理 . 使用它可以在查询数据的同时对数据进行处理 .

二. 游标的分类 : 静态游标和动态游标

   1. 在说明游标分类之前, 先说明一下PL/SQL 的两个操作, 游标属性, 变量属性

SET SERVEROUTPUT ON ;-- 此语句用于开启打印输出功能

DMBS_OUTPUT.PUT_LINE();-- 打印输出并换行.

%FOUND: 判断当前游标是否指向有效的一条行记录. 是则返回TRUE, 否则返回FALSE

%NOTFOUND: 与%FOUND 恰好相反.

%ISOPEN: 判断游标是否打开, 打开则返回TRUE, 否则返回FALSE.

%ROWCOUNT: 判断当前游标在所指向的结果集中提取的行数. 并非所有总记录数

%TYPE: 声明变量的类型与表中的某列的数据类型完全一致.%TYPE 声明有两个好处: 一是你不必知道某列的确切数据类型二是当某列的数据类型改变时不用修改变量的数据类型.

%ROWTYPE: 声明变量的数据类型与表中的行记录数据类型一致. 对于自定义的记录, 则必须声明自己的域.

  2. 静态游标:

静态游标又可以分为两类:

1) 隐式游标

隐式游标的特点:

- 隐式游标是由PL/SQL 来管理的, 即不需要声明游标语句, 也不需要OPEN,FETCH,CLOSE 操作

- 隐式游标中必须要有select cur_name into [ 变量名或其他数据类型]. 此句完成OPEN,FETCH,CLOSE 操作.

- 隐式游标只能返回一行记录, 如果无符合条件的记录将会出现NO_DATA_FOUND 异常. 如果出现多条记录将出现TOO_MANY_ROWS 异常.

- 隐式游标只能用SQL% 判断其游标属性

- 对于任何位置使用SQL%ISOPEN 结果都是FALSE, 隐式游标由PL/SQL 管理

- 对于在隐式游标位置前使用SQL%FOUND 或SQL%NOTFOUND, SQL%ROWCOUNT 结果值是NULL( 不确定值)

示例表:

表名:test

字段名

数据类型

可否为空

id( 序号)

number

N

name( 姓名)

varchar2(20)

N

zym( 专业名)

varchar(40)

Y

cj( 成绩)

number

Y

logdate( 记录日期)

date

Y

EG1: 验证隐式游标的特性

  set serveroutput on;-- 开启输出

declare

  no test.id%type;-- 声明变量no 的数据类型同test 表的id 列一致

  ename test.name%type;

  begin

  if sql%isopen then         -- 判断游标是否打开

  dbms_output.put_line(' cursor is openning');

  else

  dbms_output.put_line('cursor is closed');

  end if;

if sql%notfound then – 判断游标是否指向有效的行

  dbms_output.put_line('no value');

  else

  dbms_output.put_line(no||' '||ename);

  end if;

dbms_output.put_line(sql%rowcount);

dbms_output.put_line('---------------');

 

  select id ,name into no ,ename from test where cj=90;-- 隐式游标必-- 须使用INTO

  dbms_output.put_line(sql%rowcount);

  if sql%isopen then

  dbms_output.put_line(' cursor is openning');

  else

  dbms_output.put_line('cursor is closed');

  end if;

  if sql%notfound then

  dbms_output.put_line('no value');

  else

  dbms_output.put_line(no||' '||ename);

  end if;

  exception

  when no_data_found then

     dbms_output.put_line('no value');

when too_many_rows then

      dbms_output.put_line('too many rows');

  end;

执行结果为:

cursor is closed

--------------------

1

cursor is closed

1001 qbnajj

去掉where 条件时的结果:

cursor is closed

--------------------

too many rows

EG2: 使用%ROWTYPE

declare

  rowtype test%rowtype;

  begin

  select * into rowtype from test where cj=90;

  dbms_output.put_line(rowtype.name||' '||rowtype.cj);

  exception

  when no_data_found then

     dbms_output.put_line('no value');

  when too_many_rows then

      dbms_output.put_line('too many rows');

  end;

执行结果:

qbnajj 90

EG3: 自定义RECORD 数据类型

declare

 

  type r_type is record(name test.name%type ,cj test.cj%type);

  re_type r_type;

  begin

  select name,cj into re_type from test where cj=90;

  dbms_output.put_line(re_type.name||' '||re_type.cj);

  exception

  when no_data_found then

     dbms_output.put_line('no value');

  when too_many_rows then

      dbms_output.put_line('too many rows');

  end;

/

执行结果:

qbnajj 90

2) 显示游标

声明语法:

DECLARE

CURSOR cur_name( 参数名 数据类型) is select_satatements ;-- 游标名后-- 可带参数

BEGIN

OPEN cur_name;

FETCH cur_name into [ 变量或者其他数据类型];

-- 可用循环语句迭代输出游标所指向的结果集.

CLOSE cur_name;

END;

显示游标特性:

- 显示游标由用户定义, 并由用户来管理游标, 可返回多行记录.

- 通常使用显示游标需要遵守以下规则

   声明游标 -> 打开游标 -> 读取数据 -> 关闭游标

    但由于FOR IN LOOP 语句包含OPEN,FETCH,CLOSE 操作所以不在此例.

  - 查看游标属性时, 使用cur_name%.

EG:PL/SQL 演示

declare

  no test.id%type;

  ename test.name%type;

  cjs test.cj%type;

  cursor test_cur is

  select id,name from test where cj>=cjs;-- 可通过PL/SQL 绑定变量输-- 入值(&cjs)

  begin

  cjs:=50;

  for t_cur in test_cur

  loop

  no:=t_cur.id;

  ename:=t_cur.name;

  dbms_output.put_line(no||' '||ename);

  end loop;

  end;

执行结果:

chenjunhua 80

qbnajj 90

cjh 52

EG2: 利用带参数的存储过程演示

create or replace procedure test_proce(cjs in test.cj%type)

  as

  no test.id%type;

  ename test.name%type;

  cursor test_cur is

  select id,name from test where cj>=cjs;

  begin

  open test_cur;

  fetch test_cur into no,ename;

  while test_cur%found

  loop

  dbms_output.put_line(no||' '||ename);

  fetch test_cur into no,ename;-- 将游标指向下条记录, 否则为死循环.

  end loop;

  close test_cur;

  end test_proce;

  exec test_proce(50);

执行结果:

chenjunhua 80

qbnajj 90

cjh 52

EG3: 带参数的游标与上面的类似

分享到:
评论

相关推荐

    oracle游标变量和数据包

    oracle游标变量和数据包

    oracle 隐式游标,显示游标,游标循环

    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或...

    Oracle 游标的使用

    在PL/SQL中可以使用游标处理数据。通过使用游标可以大大提高PL/SQL程序对数据...本章将主要介绍如何使用显式游标进行多行数据的查询、游标FOR循环以及游标变量的使用,另外还将介绍游标属性以及嵌套游标的使用等内容。

    Oracle_的存储过程及游标

    Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标

    Oracle存储过程游标用法分析

    本文实例讲述了Oracle存储过程游标用法。分享给大家供大家参考,具体如下: 使用游标的5个步骤 1、声明一些变量用于保存select语句返回的指 2、声明游标,并指定select 语句 3、打开游标 4、从游标中获取记录 5、...

    oracle练习题关于触发器的作业

    一点关于oracle的练习题!较难~慢慢看吧!~受打击了别管我啊!!!!

    oracle存储过程、游标、函数、PL/SQL块

    包含oracle存储过程的增、删、查、改 %type、%rowtype的使用 自定义函数 PL/SQL块

    PL_SQL模块学习之十、游标

    文章目录游标1.1 显式游标1.1.1 创建游标1.1.2 打开游标1.1.3 获取数据1.1.4 关闭游标1.1.5 使用实例1.2 隐式游标1.2.2 游标属性1.3 FOR游标1.4 游标变量1.4 游标表达式1.5 动态游标 游标 游标是一个指针,指向一块...

    Oracle PL/SQL语言初级教程

    Oracle PL/SQL语言初级教程 1 目录 1 1.PL/SQL语言基础 3 过程 5 包(package) 6 变量和常量 6 执行部分 10 控制结构 12 小结 17 2.PL/SQL的复合数据类型 17 使用记录 19 PL/SQL集合 23 嵌套表 24 使用集合 25 集合的...

    Oracle 入门文档2

    Oracle笔记 六、PL/SQL简单语句块、变量定义 Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/SQL 游标的使用 Oracle笔记 十、PL/SQL存储过程 Oracle笔记 十一、...

    C#调用oracle方法(包括调用存储过程)

    详细的记录了C#如何调用oracle以及带有存储过程输出变量的方法,适合初学者。

    Oracle 入门文档

    Oracle笔记 六、PL/SQL简单语句块、变量定义 Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/SQL 游标的使用 Oracle笔记 十、PL/SQL存储过程 Oracle笔记 十一、...

    ORACLE_PlSql-甲骨文学习笔记

    №1声明一些变量,用于保存select语句的返回的列值 8 №2声明游标,并指定select语句 8 №3打开游标 8 №4从游标中获取记录 9 №5关闭游标 9 №6完整的示例 9 №7游标与for循环 10 6 异常 10 7 存储过程 11 №1创建...

    在Oracle PL/SQL中游标声明中表名动态变化的方法

    /* 小弟刚刚接触ORACLE存储... –这个变量就是用来存放所要取得的字段内容,但不知该如何定义 cursor curSort1 is select 服务类型 from tabname order by 编码; –此语句也不对提示找不到表名 begin …..

    oracle存储过程的基本用法

    结合实例,介绍了oracle存储过程的用法,包括定义,变量类型,游标,流程分支语句的使用

    Oracle 从入门到精通视频教程(11G版本)(ppt)

    第1章-Oracle 11g数据库简介 认识Oracle 11g 回忆Oracle的产品版本 学习Oracle 11g的新特性 第2章-Oracle 11g的安装与测试 能够使用Oracle 11g的基本条件 在Windows 2003上安装Oracle 11g 移除Oracle 11g ...

    Oracle从入门到高级应用的全部课程文档

    这是我学习Oracle时,老师给的讲义,包含了Oracle从入门到高级应用的全部资料。 以下是文件列表 Day01-Oracle基础.pdf ...Day10-变量定义和循环控制.pdf Day11-plsql游标和函数.pdf Day12-触发器.pdf Day13-索引.pdf

    Oracle数据库存储过程.pdf

    oracle数据库存储的语法,使用方法,定义变量,申明变量,游标以及完整的范例,仅供大家参考学习,谢谢大家

    Oracle11g从入门到精通2

    4.2.5 游标变量 4.3 过程 4.3.1 创建过程 4.3.2 调用过程 4.3.3 删除过程 4.3.4 过程的参数类型及传递 4.4 函数 4.4.1 创建函数 4.4.2 调用函数 4.4.3 删除函数 4.5 程序包 4.5.1 基本原理 ...

Global site tag (gtag.js) - Google Analytics