服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Oracle - Oracle 游标使用总结

Oracle 游标使用总结

2019-11-07 16:43Oracle教程网 Oracle

游标(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语句的执行结果决定是否需要插入新记录。

延伸 · 阅读

精彩推荐