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

游标在处理数据中提供了在结果集中一次一行或者多行前进或向后浏览数据的能力,可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集和结果集中指向特定记录的游标位置组成的一个临时文件,提供了在查询结果集中向前或向后浏览数据、处理结果集中数据的能力。

有了游标,用户就可以访问结果集中任意一行数据,在将游标放置到某行之后,可以在该行或从该位置的行块上执行 *** 作。

扩展资料

游标的类型

MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API服务器游标和客户游标。

1、Transact_SQL 游标

Transact_SQL 游标由DECLARE CURSOR 语法定义、主要用在Transact_SQL脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。

2、API游标

API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库都会将这些客户请求传送给服务器以对API游标进行处理。

3、客户游标

客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。

参考资料来源:百度百科—游标

这样的问法好笼统,不过,还是把我整理的给你看看吧~个人整理,无复制的哦~

A:分类:

1:隐式游标:非用户明确声明而产生的游标. 你根本看不到cursor这个关键字.

2:显示游标:用户明确通过cursor关键字来声明的游标.

3:引用游标:

B:什么是隐式游标:

1:什么时候产生:

会在执行任何合法的SQL语句中产生.他不一定存放数据.也有可能存放记录集所影响的行数.

如果执行SELECT语句,这个时候游标会存放数据.如果执行INSERT、UPDATE、 DELETE会存放记录影响的行数.

C:隐式游标叫什么名字:

名字叫sql

关于sql的游标变量到底有哪些呢?

作用:返回最近一次执行SQL语句所涉及的游标相关信息.因为每执行一次SQL语句,都会产生一个隐式游标.那么当前执行的SQL语句就是当前的隐式游标.

sql%found

sql%notfound

sql%rowcount

sql%isopen

D:关于隐式游标的例子:

create table 学生基本信息表

(

StuID number(2),

StuName varchar2(20)

)

alter table 学生基本信息表 add constraint PK_STUID primary key(StuID)

declare

num number:=0

begin

num:=&num

delete from 学生基本信息表 where StuID=num

if sql%notfound then

dbms_output.put_line('该行数据没有发现')

else

dbms_output.put_line('数据被发现并删除,影响的行数为:'||sql%rowcount)

end if

end

E:关于显示游标的例子:

1:如何定义显示游标

declare cursor <cursor_name>is [select语句]

declare cursor mycur is select empno,ename,job from scott.emp

2:如何打开游标:

open <cursor_name>

open mycur

3:如何通过游标来读取数据

fetch <cursor_name>into <variable_list>

4:如何关闭游标:

close <cursor_name>

close mycur

注意:在Oracle中,不需要显示销毁游标.因为在Oracle中,很多东西是由JAVA写的.Oracle会自动销毁游标.

5:举例:

declare

cursor mycur is select empno,ename,job from emp --创建游标

vempno emp.empno%type

vename emp.ename%type

vjob emp.job%type

begin

open mycur--打开游标

fetch mycur into vempno,vename,vjob--使用数据

dbms_output.put_line('I Found You!'||mycur%rowcount||'行')

dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob)

close mycur

end

因为只读出来一条,所以要遍历一下:

declare

cursor mycur is select empno,ename,job from emp

vempno emp.empno%type

vename emp.ename%type

vjob emp.job%type

begin

open mycur

loop—循环,遍历

fetch mycur into vempno,vename,vjob

exit when mycur%notfound

if mycur%found then

dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob)

end if

end loop

dbms_output.put_line('I Found You!'||mycur%rowcount||'行')

close mycur

end

6:通常情况下我们在读取表数据的时候,我们需要动态的去查询.所以能不能在Oracle中给游标带参数呢?可以!

1):如何定义带参数的游标:

declare cursor <cursor_name>(参数名称 参数类型描述) is select xxxxx from bbbbb where aaa==??? and ccc=???

2):例子:

游标是一个集合,读取数据有两种方式

第一种方式: open fetch close

第二种方式: for 一但使用了for循环 ,在循环刚刚开始的时候,相当于执行open,在处理循环的时候,相当于执行fetch,在退出循环的时候,相当于执行了close

Declare cursor query(vname varchar) is select empno,ename,job from emp where ename like'%'||vname||'%'

三种游标的例子:

--

DECLARE

CURSOR TEST_CUR IS

SELECT * FROM EMP

MY_CUR EMP%ROWTYPE

BEGIN

OPEN TEST_CUR

FETCH TEST_CUR INTO MY_CUR

WHILE TEST_CUR%FOUND

LOOP

DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME)

FETCH TEST_CUR INTO MY_CUR

END LOOP

CLOSE TEST_CUR

END

--

DECLARE

CURSOR TEST_CUR IS

SELECT * FROM EMP

BEGIN

FOR MY_CUR IN TEST_CUR

LOOP

DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME)

END LOOP

END

--

DECLARE

CURSOR TEST_CUR(V_SAL NUMBER) IS

SELECT *

FROM EMP

WHERE SAL >V_SAL

V_SAL1 NUMBER

BEGIN

V_SAL1 := 2000

FOR MY_CUR IN TEST_CUR(V_SAL1)

LOOP

DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME)

END LOOP

END


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存