oracle 游标是做什么用的

oracle 游标是做什么用的,第1张

游标(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_outputPUT_LINE(v_stuno||'->'||v_stuname);

--继续将游标所指的当前行取出放到变量中

fetch cur_stu into v_stuno,v_stuname;

end loop;

close cur_stu; --4关闭游标

end;

END PROC_STU1;

(2)使用IFELSE代替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_outputPUT_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_outputPUT_LINE(stustuno||'->'||stustuname);

--循环做隐含检查 %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_outputPUT_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语句的执行结果决定是否需要插入新记录。

1、plsql是面向过程的语言,这类语言还有c,cobol等,这类语言的共同点是一次只能处理一条数据,而数据库sql返回的对象是一个集合,这样直接用plsql程序 *** 作就会出现问题。

2、在这种环境下就出现了游标,游标实际是一个内存地址,只想的是sql查询出的结果集,当需要的时候再根据游标一条一条取数据fetch,直到全部数据取完。

---

以上,希望对你有所帮助。

一般动态游标有 REF CURSOR、REF CURSOR RETURN、SYS_REFCURSOR。REF CURSOR RETURN 为强类型,REF CURSOR 为弱类型、SYS_REFCURSOR 为系统预定义(在STANDARD包中定义的)弱类型。有问题再追问。

create or replace procedure my_procedure

(mypageNo number,mypageSize number,myInfo_Cursor out sys_refcursor)

as

pageNO number;

pageSize number;

begin

open myInfo_Cursor for

select from product

where pid between 1 + (pageNo - 1) pageSize and 4 + (pageNo - 1) pageSize;

end;

1、plsql是面向过程的语言,这类语言还有c,cobol等,这类语言的共同点是一次只能处理一条数据,而数据库sql返回的对象是一个集合,这样直接用plsql程序 *** 作就会出现问题。

2、在这种环境下就出现了游标,游标实际是一个内存地址,只想的是sql查询出的结果集,当需要的时候再根据游标一条一条取数据fetch,直到全部数据取完。

---

以上,希望对你有所帮助。

set serveroutput on

declare 

    v_login_name varchar2(10):='lisi';

    rec sswmc%type;

    cur testpkg1c_cur;

begin

    get_swmc(v_login_name,cur);

    dbms_outputput_line('SWMC ');

    dbms_outputput_line('--------- ');

    loop    

        fetch cur into rec;

        exit when cur%notfound;

        dbms_outputput_line(rec);

    end loop;

end;

Oracle中显示游标,隐式游标,循环游标,动态游标的区别和应用

显式游标使用的是SELECT叙述,被声明于任何一个区块的声明段落中,开发者可以控制几乎所有与游标有关的 *** 作。

显示游标对游标的处理提供了其他类似的游标无法做到的控制。他们要使用一次会传回多余一笔记录的SELECT叙述。

因为我们做的数据量大,而且系统上跑的不只我们一个业务。所以,我们都要求尽量避免使用游标,游标使用时会对行加锁,可能会影响其他业务的正常进行。而且,数据量大时其效率也较低效。另外,内存也是其中一个限制。

因为游标其实是相当于把磁盘数据整体放入了内存中,如果游标数据量大则会造成内存不足,内存不足带来的影响大家都知道了。

所以,在数据量小时才使用游标。

以上就是关于oracle 游标是做什么用的全部的内容,包括:oracle 游标是做什么用的、Oracle中的游标和cursor是什么,怎么用的啊、数据库oracle中有几种游标类型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10176476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存