Oracle游标分为显示游标和隐式游标
显示游标(Explicit Cursor):在PL/SQL程序中定义的用于查询的游标称作显示游标
隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的而且是在PL/SQL中使用UPDATE/DELETE语句时Oracle系统自动分配的游标
一显示游标
使用步骤
()定义 ()打开 ()使用 ()关闭
使用演示
首先创建测试用表STUDENT脚本如下
()使用WHILE循环处理游标
create or replace PROCEDURE PROC_STU AS
BEGIN
显示游标使用使用while循环
declare
定义游标名称为cur_stu
cursor cur_stu is
select stunostuname from student order by stuno;
定义变量存放游标取出的数据
v_stuno varchar();
v_stuname varchar();
begin
打开游标cur_stu
open cur_stu;
将游标的当前行取出存放到变量中
fetch cur_stu into v_stunov_stuname;
while cur_stu%found 游标所指还有数据行则继续循环
loop
打印结果
dbms_outputPUT_LINE(v_stuno||>||v_stuname);
继续将游标所指的当前行取出放到变量中
fetch cur_stu into v_stunov_stuname;
end loop;
close cur_stu; 关闭游标
end;
END PROC_STU;
()使用IFELSE代替WHILE循环处理游标
create or replace PROCEDURE PROC_STU AS
BEGIN
显示游标使用使用if判断
declare
定义游标名称为cur_stu
cursor cur_stu is
select stunostuname from student order by stuno;
定义变量存放游标取出的数据
v_stuno varchar();
v_stuname varchar();
begin
打开游标cur_stu
open cur_stu;
将游标的当前行取出存放到变量中
fetch cur_stu into v_stunov_stuname;
loop
if cur_stu%found then 如果游标cur_stu所指还有数据行
打印结果
dbms_outputPUT_LINE(v_stuno||>||v_stuname);
继续将游标所指的当前行取出放到变量中
fetch cur_stu into v_stunov_stuname;
else
exit;
end if;
end loop;
close cur_stu; 关闭游标
end;
END PROC_STU;
()使用FOR循环处理游标
create or replace PROCEDURE PROC_STU AS
BEGIN
显示游标使用使用for循环
declare
定义游标名称为cur_stu
cursor cur_stu is
select stunostuname from student order by stuno;
begin
for stu in cur_stu
loop
dbms_outputPUT_LINE(stustuno||>||stustuname);
循环做隐含检查 %notfound
end loop;
自动关闭游标
end;
END PROC_STU;
()常用的使用EXIT WHEN处理游标
create or replace
PROCEDURE PROC_STU_ AS
BEGIN
显示游标使用使用exit when循环
declare
定义游标名称为cur_stu
cursor cur_stu is
select stunostuname from student order by stuno;
定义变量存放游标取出的数据
v_stuno varchar();
v_stuname varchar();
begin
打开游标cur_stu
open cur_stu;
loop
将游标的当前行取出存放到变量中
fetch cur_stu into v_stunov_stuname;
exit when cur_stu%notfound; 游标所指还有数据行则继续循环
打印结果
dbms_outputPUT_LINE(v_stuno||>||v_stuname);
end loop;
close cur_stu; 关闭游标
end;
END PROC_STU_;
二隐式游标
使用演示
create or replace PROCEDURE PROC_STU AS
BEGIN
隐式游标使用
update student set stuname=张燕广 where stuno=;
如果更新没有匹配则插入一条新记录
if SQL%NOTFOUND then
insert into student(STUNOSTUNAMEAGEGENDER)
values(张燕广男);
end if;
END PROC_STU;
说明
所有的SQL语句在上下文区内部都是可执行的因为都有一个游标指向上下文区此游标就是
SQL游标与现实游标不同的是SQL游标在PL/SQL中不需要打开和关闭而是在执行UPDATE
DELETE是自动打开和关闭
上面例子中就是通过SQL%NOTFOUND游标属性判断UPDATE语句的执行结果决定是否需要插入新记录CREATE TABLE STUDENT (
STUNAME VARCHAR( BYTE)
STUNO VARCHAR( BYTE)
AGE NUMBER
GENDER VARCHAR( CHAR)
)