oracle+语句块游标,Oracle 游标简介

1、游标简介

使用游标,可以每次一行地检索和处理select语句所返回的数据行。命名游标,目的是方便引用。

2、隐式游标

无论何时sql语句执行,当该sql语句不存在显式有标时,任何特定PL/SQL语句块都会产生一个隐式游标。游标自动地与每个DML(数据操作)语句(update、delete和insert)建立关联。所有update和delete语句都有标识被当前操作所影响数据行集合的游标。insert语句需要存储位置来接收即将插入数据库的数据,隐式游标可以满足这个需求。最近一次被打开的游标被称为sql游标。

3、显式游标

1)声明游标。这会在内存中建立游标的初始化环境

2)打开游标。打开被声明的游标,并分配内存。

3)检索游标。现在,被声明和打开的游标能够检索数据。

4)关闭游标。被声明、打开和检索使用后的游标被关闭,以释放所分配的内存。

基于表的记录就是该记录的结构来自于数据库表中某些字段的列表,基于游标的记录是记录的数据结构匹配预定义游标的元素。为创建一个基于表或者基于游标的记录,可以使用%rowtype属性。

DECLARE

c_name   test01%ROWTYPE;

BEGIN

SELECT *   INTO c_name    FROM test01   WHERE id >2;

DBMS_OUTPUT.put_line (

c_name.id || '===' || c_name.name || '====' || c_name.addtime);

END;

DECLARE

CURSOR c_test   IS  SELECT * FROM test01;

c_name   test01%ROWTYPE;

BEGIN

OPEN c_test;

LOOP

FETCH c_test INTO c_name;

EXIT WHEN c_test%NOTFOUND;

DBMS_OUTPUT.put_line (

c_name.id || '==' || c_name.name || '=======' || c_name.addtime);

END LOOP;

CLOSE c_test;

END;

4、用户定义记录

是基于程序员定义的记录类型的,首先声明一个记录类型,然后基于前面的步骤中所定义的记录类型来声明记录变量;

type type_name is record

(field_name 1 datatype1,

field_name 2 datatype2

...

field_name n datatype n);

record_name type_name%rowtype;

5、游标的属性

--%notfound

语法:cursor_name%notfound

描述:一个boolean属性:当前面的fetch操作没有返回数据行时,该属性的值是ture,否则是false;

--%found

语法:cursor_name%found

描述:一个boolean属性:当前面的fetch操作返回一行数据时,该属性的值是ture,否则是false

--%rowcount

语法:cursor_name%rowcount

描述:从游标中所检索的记录数量

--%isopen

语法:cursor_name%isopen

描述:一个boolean属性:当游标处于打开状态时,则该属性的值是ture,否则是false;

6、有关游标的提示

游标select 列表

把select 列表与pl/sql变量或者pl/sql记录组件进行匹配。变量的数量必须等于select 列表中列或者表达式的数量。记录中组件的数量必须匹配select列表中列或者表达式。

游标作用范围

在主语句块(或者外围语句块)中所声明的游标的作用范围会扩展到子语句块。

游标select列表中表达式

pl/sql变量、表达式,甚至函数可以包含在游标select列表中。

游标中列的别名

别名是给select列表中列或者表达式所提供的代替名字。在显式的游标列种,在如下情况下,必须使用别名进行计算:

使用针对游标的%rowtype来检索记录。

希望引用程序中的别计算列。

/*  使用游标for循环和嵌套游标 */

DECLARE

CURSOR c_name  IS   SELECT *   FROM test01  WHERE id < 5;

BEGIN

FOR v_name IN c_name

LOOP

UPDATE test01

SET stime = TO_DATE ('2018-10-10', 'yyyy-mm-dd')

WHERE id = v_name.id;

END LOOP;

commit;

END;

本公众号是个人学习工作笔记,希望大家发现问题能及时和我本人沟通,希望你与我共同成长。个人微信zgjt12306。

欢迎关注“自学Oracle”

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值