来源:http://www.jzxue.com/shujuku/oracle/200910/01-2839.html

游标(CURSOR)也叫光标,在关系数据库中经常使用,在PL/SQL程序中可以用CURSOR与SELECT一起对表或者视图中的数据进行查询并逐行读取。

Oracle游标分为显示游标和隐式游标。

显示游标(Explicit Cursor):在PL/SQL程序中定义的、用于查询的游标称作显示游标。

隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的、而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标。

一.显示游标

1.使用步骤

(1)定义 (2)打开 (3)使用 (4)关闭

2.使用演示

首先创建测试用表STUDENT,脚本如下:

CREATE TABLE "STUDENT" (

"STUNAME" VARCHAR2(10 BYTE),

"STUNO" VARCHAR2(4 BYTE),

"AGE" NUMBER,

"GENDER" VARCHAR2(2 CHAR)

)

(1).使用WHILE循环处理游标

create or replace PROCEDURE PROC_STU1 AS

BEGIN

--显示游标使用,使用while循环

declare

--1.定义游标,名称为cur_stu

cursor cur_stu is

select stuno,stuname from student order by stuno;

--定义变量,存放游标取出的数据

v_stuno varchar(4);

v_stuname varchar(20);

begin

--2.打开游标cur_stu

open cur_stu;

--3.将游标的当前行取出存放到变量中

fetch cur_stu into v_stuno,v_stuname;

while cur_stu%found --游标所指还有数据行,则继续循环

loop

--打印结果

dbms_output.PUT_LINE(v_stuno||'->'||v_stuname);

--继续将游标所指的当前行取出放到变量中

fetch cur_stu into v_stuno,v_stuname;

end loop;

close cur_stu; --4.关闭游标

end;

END PROC_STU1;

(2).使用IF..ELSE代替WHILE循环处理游标

create or replace PROCEDURE PROC_STU2 AS

BEGIN

--显示游标使用,使用if判断

declare

--1.定义游标,名称为cur_stu

cursor cur_stu is

select stuno,stuname from student order by stuno;

--定义变量,存放游标取出的数据

v_stuno varchar(4);

v_stuname varchar(20);

begin

--2.打开游标cur_stu

open cur_stu;

--3.将游标的当前行取出存放到变量中

fetch cur_stu into v_stuno,v_stuname;

loop

if cur_stu%found then --如果游标cur_stu所指还有数据行

--打印结果

dbms_output.PUT_LINE(v_stuno||'->'||v_stuname);

--继续将游标所指的当前行取出放到变量中

fetch cur_stu into v_stuno,v_stuname;

else

exit;

end if;

end loop;

close cur_stu; --4.关闭游标

end;

END PROC_STU2;

(3).使用FOR循环处理游标

create or replace PROCEDURE PROC_STU3 AS

BEGIN

--显示游标使用,使用for循环

declare

--定义游标,名称为cur_stu

cursor cur_stu is

select stuno,stuname from student order by stuno;

begin

for stu in cur_stu

loop

dbms_output.PUT_LINE(stu.stuno||'->'||stu.stuname);

--循环做隐含检查 %notfound

end loop;

--自动关闭游标

end;

END PROC_STU3;

(4).常用的使用EXIT WHEN处理游标

create or replace

PROCEDURE PROC_STU1_1 AS

BEGIN

--显示游标使用,使用exit when循环

declare

--1.定义游标,名称为cur_stu

cursor cur_stu is

select stuno,stuname from student order by stuno;

--定义变量,存放游标取出的数据

v_stuno varchar(4);

v_stuname varchar(20);

begin

--2.打开游标cur_stu

open cur_stu;

loop

--3.将游标的当前行取出存放到变量中

fetch cur_stu into v_stuno,v_stuname;

exit when cur_stu%notfound; --游标所指还有数据行,则继续循环

--打印结果

dbms_output.PUT_LINE(v_stuno||'->'||v_stuname);

end loop;

close cur_stu; --4.关闭游标

end;

END PROC_STU1_1;

二.隐式游标

1.使用演示

create or replace PROCEDURE PROC_STU4 AS

BEGIN

--隐式游标使用

update student set stuname='张燕广' where stuno='1104';

--如果更新没有匹配则插入一条新记录

if SQL%NOTFOUND then

insert into student(STUNO,STUNAME,AGE,GENDER)

values('1104','张燕广',18,'男');

end if;

END PROC_STU4;

2.说明

所有的SQL语句在上下文区内部都是可执行的,因为都有一个游标指向上下文区,此游标就是SQL游标,与现实游标不同的是,SQL游标在PL/SQL中不需要打开和关闭,而是在执行UPDATE、 DELETE是自动打开和关闭。

上面例子中就是通过SQL%NOTFOUND游标属性判断UPDATE语句的执行结果决定是否需要插入新记录。

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

游标里面如何使用变量绑定?

示例如下:

declare

type rc is ref cursor;

l_rc rc;

l_dummy all_objects.object_name%type;

l_start number default dbms_utility.get_time;

begin

for i in 1 .. 1000

loop

open l_rc for

'select object_name

from all_objects

where object_id = :x'

using i;

fetch l_rc into l_dummy;

close l_rc;

end loop;

dbms_output.put_line

( round( (dbms_utility.get_time-l_start)/100, 2 ) ||

' seconds...' );

end;

oracle游标声明中使用变量赋值,Oracle游标使用方法(游标里使用变量绑定)相关推荐

  1. oracle游标循环定义变量赋值,PL/SQL  循环 数组 游标的使用

    1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量名 变量类型 ...

  2. 变量: 赋值 的几种方法

    from SQL-Server documentation 示例 A. 输出使用 SET 初始化的变量值 下例创建 @myvar 变量,将一个字符串值放在变量中,并输出 @myvar 变量的值. DE ...

  3. java成员变量怎么赋值_给成员变量赋值的两种方法

    JAVA 跟C++ 差不多,给类里面的私有成员变量一般有两种方法: 一种是通过 成员函数 来赋值 一种是:通道构造函数来赋值 /* 我们一直在使用构造方法,但是,我们确没有定义构造方法,用的是哪里来的 ...

  4. php 用count 变量,countif函数的使用方法 PHP的可变变量名的使用方法分享

    通常变量通过下面这样的语句来命名 : 复制代码 代码如下: 可变变量名指的是使用一个变量的值作为这个变量的名称.在上面的例子中,通过使用两个$符号,你可以把hello设置成一个变量的名称,就像下面那样 ...

  5. oracle声明一个表变量赋值,Oracle Declare 变量声明

    declare 在 Oracle 一般是用在函数.存储过程和块结构及简单的事务中. 普通变量 声明declare v_number number(10); -- 长度10 v_char varchar ...

  6. oracle绑定变量赋值,Oracle教程之绑定变量

    绑定变量是指在sql语句的条件中使用变量而不是常量.比如shared pool里有两条sql语句, select * from tab1 where col1=1; select * from tab ...

  7. oracle取得表中总记录数最快的方法

    查询表中的记录总数的语法就是SELECT COUNT(*) FROM TABLE_NAME.这可能是最经常使用的一类SQL语句. 本文讨论怎样才能最快的得到这个记录数.本文纯粹主要是理论上的讨论,文章 ...

  8. sql server linkserver oracle,SQL Server中使用Linkserver连接Oracle的方法

    1.安装Oracle Client 连接到Oracle的前提是在SQL Server服务器上安装Oracle Client.Oracle Client下载地址如下: 安装完毕后要修改对应的tnsnam ...

  9. springboot数据源oracle,springboot+mybatis中使用多数据源oracle数据库

    写在前面:工作原因,使用的是oracle数据库.由于之前没有接触过,写一篇博客做点笔记. 如果要在springboot项目中连接oracle,首先肯定是要先加入依赖,但是好像在maven仓库里没有or ...

最新文章

  1. 王朝阳:河北高校邀请赛 -- 二手车交易价格预测决赛答辩
  2. Mac是大脑,iPad是四肢 如何实现的呢?右键而已
  3. java的indexof怎么配合数组使用_【小知识点??】indexOf在数组中竟能这样使用???!...
  4. DevOps 实践:千里之行
  5. oracle9i 随机端口_修改 Oracle9i 8080端口问题
  6. OSS在线迁移服务剖析
  7. java单词查找树_Trie 单词查找树 java实现(来自算法第4版)
  8. 地图距离算法_ORB-SLAM3 单目地图初始化(终结篇)
  9. 解读最具O2O属性—哈根达斯微信企业号的成功之道
  10. oracle的查询数据(检索数据)
  11. 国家自然科学基金申请书写作攻略
  12. 贵阳市建筑物矢量数据(Shp格式+带高度)
  13. Excel中将汉字(名字)转换为拼音
  14. 汽车4G车载TBOX智能信息终端
  15. 挑选微信h5开发制作公司的标准是什么?
  16. mysql dbms是什么_数据库管理系统(DBMS)是用来做什么的?
  17. 大数据练习题答案(仅供参考)
  18. 华大半导体HC32F4A0笔记(五),使用CMSIS-DSP库进行FFT运算
  19. 单片机跑马灯程序c语言,MCS-51单片机控制跑马灯的三种方法
  20. EasyPlayer-RTSP-Android安卓播放器播放RTSP延迟优化策略,极低延时!

热门文章

  1. 自动驾驶车辆在结构化场景中基于HD-Map由粗到精语义定位
  2. 在CentOS 6.3 64bit上使用 smartmontools和MageCli 监测硬盘的健康状态
  3. 【C4D教程】Octane渲染大师班
  4. C++ STL: 超详细 容器 deque 以及 适配器queue 和 stack 源码分析
  5. xBIM 实战01 在浏览器中加载IFC模型文件
  6. ReentrantLock+线程池+同步+线程锁
  7. python pexpect包的一些用法
  8. Vue源码终笔-VNode更新与diff算法初探
  9. Java面试查漏补缺
  10. 《学习OpenCV》第三章习题 第3题