在PL/SQL块执行SELECT ,INSERT,UPDATE,DELETE语句时,ORACLE会在内存中为其分配上下文区(Context Area)。游标是指向该区的指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。
它为应用程序提供了一种对具有多行数据的查询结果集中每行数据进行单独处理的方法,是设计交互式应用程序的常用编程接口。
它为应用程序提供了一种对具有多行数据的查询结果集中每行数据进行单独处理的方法,是设计交互式应用程序的常用编程接口。
游标的优点:
游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作
它还提供对基于游标位置而对表中数据进行删除或更新的能力
游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来使两个数据处理方式能够进行沟通
它还提供对基于游标位置而对表中数据进行删除或更新的能力
游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来使两个数据处理方式能够进行沟通
定义好游标后开始:
打开游标
OPEN 游标名;
检索记录
FETCH语句检索记录集中的行,每次一行,每执行一次FETCH,游标前进到记录集的下一行。
关闭游标
CLOSE 游标名;
OPEN 游标名;
检索记录
FETCH语句检索记录集中的行,每次一行,每执行一次FETCH,游标前进到记录集的下一行。
关闭游标
CLOSE 游标名;
简单描述如下:
游标的使用方法:
--创建游标
--打开游标
--遍历游标
--关闭游标
declare
v_age stu.age%type;
v_total_age stu.age%type;
courso cur_var is select age from stu;--创建游标
begin
v_total_age :=0;
open cur_var;--打开游标
fetche cur_var into v_age;
while cur_var%found loop--遍历游标
v_total_age :=v_total_age+v_age;
fetch cur_var into v_age;
end loop;
close cur_var;
end;
通过上面的例子,下面简单介绍游标的属性:
(1)%FOUND – SQL 语句影响了一行或多行时为 TRUE,即游标找到数据就返回TRUE,反之则返回FALSE
(2)%NOTFOUND – SQL 语句没有影响任何行时为TRUE,即游标没有找到数据就返回TRUE,反之则返回FALSE
(3)%ROWCOUNT – SQL 语句影响的行数,即返回游标所找到的数据行数(返回一个整数)
(4)%ISOPEN - 游标是否打开,即游标打开为TRUE,反之则为FALSE
(2)%NOTFOUND – SQL 语句没有影响任何行时为TRUE,即游标没有找到数据就返回TRUE,反之则返回FALSE
(3)%ROWCOUNT – SQL 语句影响的行数,即返回游标所找到的数据行数(返回一个整数)
(4)%ISOPEN - 游标是否打开,即游标打开为TRUE,反之则为FALSE
使用显式游标更新行:
允许使用游标删除或更新活动集中的行
声明游标时必须使用 SELECT … FOR UPDATE语句
CURSOR <cursor_name> IS
SELECT statement FOR UPDATE;
声明游标时必须使用 SELECT … FOR UPDATE语句
CURSOR <cursor_name> IS
SELECT statement FOR UPDATE;
UPDATE <table_name>
SET <set_clause>
WHERE CURRENT OF <cursor_name>
SET <set_clause>
WHERE CURRENT OF <cursor_name>
例子:
DECLARE
new_price NUMBER;
CURSOR cur_toy IS
SELECT toyprice FROM toys WHERE toyprice<100
FOR UPDATE OF toyprice;
BEGIN
OPEN cur_toy;
LOOP
FETCH cur_toy INTO new_price;
EXIT WHEN cur_toy%NOTFOUND;
UPDATE toys
SET toyprice = 1.1*new_price
WHERE CURRENT OF cur_toy;
END LOOP;
CLOSE cur_toy;
COMMIT;
END;
new_price NUMBER;
CURSOR cur_toy IS
SELECT toyprice FROM toys WHERE toyprice<100
FOR UPDATE OF toyprice;
BEGIN
OPEN cur_toy;
LOOP
FETCH cur_toy INTO new_price;
EXIT WHEN cur_toy%NOTFOUND;
UPDATE toys
SET toyprice = 1.1*new_price
WHERE CURRENT OF cur_toy;
END LOOP;
CLOSE cur_toy;
COMMIT;
END;