【Oracle学习】之 游标(CURSOR)

时间:2022-11-27 08:16:54

Q:为什么需要游标?
A:① PL/SQL的游标指把从数据库中查询出来的数据以临时表的形式存放在内存中。游标可以对存储在内存中的数据数据进行操作,返回一条或一组记录,或者一条记录也不返回。
  ② PL/SQL中的记录和表类型虽然也可以用来存放数据,但对一组存放在内存中的数据进行操作,还是不太方便,游标恰好是实现这一功能的有力工具。


  当在PL/SQL块中执行查询语句(SELECT)和 数据操纵语句(DML)时,Oracle会在内存中分配一个缓冲区,缓冲区中包含了处理过程的必须信息,包括已经处理完的行数、指向被分析行的指针和查询情况下的活动集,即查询语句返回的数据行集。该缓冲区域称为上下文去。游标是指向该缓冲区的句柄或指针。


一、PL/SQL中的游标分为两类:

(1)显式游标:由用户定义、操作,用于处理返回多行(一行或多行)数据的SELECT查询。(SELECT显式游标,其他均为隐式游标)

(2)隐式游标:由系统自动进行操纵,用于处理DML语句和返回单行数据的SELECT查询。(SELECT INTO 或 DML语句)


二、隐式游标

  说明:PL/SQL在执行一个SQL语句时,Oracle服务器将自动创建一个隐式游标。隐式游标是内存中处理该语句的工作区域,其名称固定为SQL。隐式游标无须声明和打开,使用完之后也不用关闭,所有这一切都由系统自动维护。

隐式游标主要用于处理:INSERT,UPDATE,DELETE 以及 单行SELECT…INTO语句,没有OPEN,FETCH,CLOSE等操作语句


隐式游标 4 个属性:
(1)SQL%ISOPEN:对用户而言始终为FALSE,因为操作时系统自动打开,操作完后立即自动关闭。
(2)SQL%FOUND:
(3)SQL%NOTFOUND:
(4)SQL%ROWCOUNT:

【Oracle学习】之 游标(CURSOR)
【Oracle学习】之 游标(CURSOR)


三、显式游标

  步骤:①定义游标②打开游标③检索游标④关闭游标


①定义游标

//语法
cursor cursor_name is select...;

定义游标需要注意:
1。 游标必须在PL/SQL块的声明部分进行定义
2。游标定义时可以引用PL/SQL变量,但变量必须在游标定义之前定义;
3。定义游标时并没有生成数据,只是将定义信息保存在数据字典中;
4。 游标定义后,可以使用curso_name%ROWTYPE定义记录类型的变量。


②打开游标

//语法
OPEN cursor_name;

打开游标需要注意:
1。 只有在打开游标时,才能真正创建缓冲区,并从数据库检索数据。
2。游标一旦打开,就无法再次打开,除非先关闭;
3。如果游标定义中的变量值发生变化,则只能在下次打开游标时才起作用。


③检索游标

//语法
FETCH cursor_name INTO variable_list|record_variable;

检索游标需要注意:
1。 在使用FETCH语句之前必须先打开游标,保证缓冲区中有数据;
2。对游标第一次使用FETCH语句时,游标指针指向第一条记录,因此操作的对象是第一条记录。操作完后,游标指针指向下一个记录;
3。游标指针只能向下移动,不能回退。如果想检索完第二条记录后又返回第一条记录,则必须关闭游标,然后重新打开游标;
4。INTO子句中变量个数、顺序、数据类型必须与缓冲区中每个记录的字段数量、顺序以及数据类型相匹配,也可以是记录类型的变量。

create or replace procedure p1

as
lr test2_student%rowtype;


cursor curl is select * from test2_student where s_id = 1;

begin

open curl;

fetch curl into lr;

dbms_output.put_line(lr.s_id || ' ' || lr.s_name || ' ' || lr.s_class || ' ' || lr.s_score);

close curl;

end;

【Oracle学习】之 游标(CURSOR)