数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

ORACLEPLSQL游标学习


发布日期:2024年04月10日
 
ORACLEPLSQL游标学习

游标

游标是指向上下文区域的句柄或指针

上下文区域用于SQL处理的内存区

上下文区域的内容

语句处理的行数

指向语句的语法分析表示的指针

游标的类型

静态游标

隐式游标

显示游标

REF游标(动态游标)

隐式游标

有ORACLE在内部声明

用于处理

DML语句

返回单行的查询

游标属性

%NOTFOUND 对数据操作成功返回FALSE否则返回TRUE

%FOUND 对数据操作成功返回TRUE否则返回FALSE

%ROWCOUNT 游标影响的行数

%ISOPEN 游标是否打开

begin

insert into cities values(aaabbb);

DBMS_OUTPUTPUT_LINE(游标所影响的行数||SQL%ROWCOUNT);

if SQL%NOTFOUND then

DBMS_OUTPUTPUT_LINE(NOTFOUND为真);

else

DBMS_OUTPUTPUT_LINE(NOTFOUND为假);

end if;

if SQL%FOUND then

DBMS_OUTPUTPUT_LINE(FOUND为真);

else

DBMS_OUTPUTPUT_LINE(FOUND为假);

end if;

if SQL%ISOPEN then

DBMS_OUTPUTPUT_LINE(ISOPEN为真);

else

DBMS_OUTPUTPUT_LINE(ISOPEN为假);

end if;

end;

输出结果为

游标所影响的行数

NOTFOUND为假

FOUND为真

ISOPEN为假

declare

icount int :=;

begin

insert into cities values (aaabbb);

if SQL%NOTFOUND then

DBMS_OUTPUTPUT_LINE(没有插入成功);

else

DBMS_OUTPUTPUT_LINE(插入成功);

end if;

commit;

end;

输出结果为

插入成功

declare

icount int :=;

begin

update cities set country=aaaa;

if SQL%NOTFOUND then

DBMS_OUTPUTPUT_LINE(没有更新成功);

else

DBMS_OUTPUTPUT_LINE(更新成功);

end if;

commit;

end;

输出结果为

更新成功

显式游标

由用户显式声明

游标将指向活动集中的当前行

控制显示游标

Open

Fetch

Close

declare

cursor empCur is select * from emp;

emprow emp%ROWTYPE;

begin

open empCur;

fetch empCur into emprow;

DBMS_OUTPUTput_line(emprowempno|| ||emprowename);

close empCur;

end;

输出结果

SMITH

loop循环

declare

cursor empCur is select * from emp;

emprow emp%ROWTYPE;

begin

open empCur;

loop

fetch empCur into emprow;

DBMS_OUTPUTput_line(emprowempno|| ||emprowename);

DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||);

exit when empCur%NOTFOUND;

if empCur%NOTFOUND then

exit ;

end if;

end loop;

close empCur;

end;

while循环

declare

cursor empCur is select * from emp;

emprow emp%ROWTYPE;

begin

open empCur;

fetch empCur into emprow;

while empCur%FOUND loop

DBMS_OUTPUTput_line(emprowempno|| ||emprowename);

DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||);

fetch empCur into emprow;

end loop;

close empCur;

end;

输出结果

SMITH

提取了

ALLEN

提取了

WARD

提取了

JONES

提取了

MARTIN

提取了

BLAKE

提取了

CLARK

提取了

SCOTT

提取了

KING

提取了

TURNER

提取了

ADAMS

提取了

JAMES

提取了

FORD

提取了

MILLER

提取了

MILLER

提取了

for循环

循环游标

显式游标的替代方法

它的工作原理是什么

隐式打开游标

自动从活动集获取行

在处理完所有行时关闭游标

优点

简化代码的编写

declare

cursor empCur is select * from emp where sal>&intputsal;绑定变量

iCount int ;

begin

iCount := &Count;

DBMS_outputput_line(iCount);

for emprow in empCur loop

DBMS_OUTPUTput_line(emprowempno|| ||emprowename);

DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||);

end loop;

end;

REF游标

在运行时使用不同的语句与之关联

REF游标使用游标变量

游标变量

一种引用类型

可以在运行时指向不同的存储位置

Close 语句关闭游标并释放用于查询的资源

游标变量的类型

具有约束的游标变量

具有返回类型的游标变量

也称为强游标

无约束的游标变量

没有返回类型的游标变量

也称为弱游标

declare

type RefEmpcur is ref cursor return emp%ROWTYPE;

Empcur RefEmpcur;

Emprow emp%ROWTYPE;

flag int := ;

begin

flag := &flag;

if flag= then

OPEN Empcur for select * from emp where sal> and sal<;

elsif flag= then

OPEN Empcur for select * from emp where sal>=;

else

OPEN Empcur for select * from emp;

end if;

loop

fetch Empcur into Emprow;

DBMS_OUTPUTPUT_LINE(Emprowempno);

exit when Empcur%NOTFOUND;

end loop;

close Empcur;

end;

游标变量的限制

不能在程序包中声明游标变量

远程子程序不能接受游标变量的值

不能使用比较操作符对游标变量进行相等或不相等测试

不能将空值赋予游标变量

表不能存储游标变量的值

上一篇:在Oracle使用正规表达式编写更好的SQL语句

下一篇:通过幸存oracle文件修复oracle9i数据