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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)