Oracle 游标
游标就是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据。
典型游标for循环
游标for循环显示游标的一种快捷使用方式,它使用for循环一次读取结果集中的行数据,当for循环开始时,游标自动打开(不需要open),每循环一次系统自动读取游标当前行的数据(不需要fetch),当退出循环时,游标自动被关闭,(不需要使用close)使用游标for循环的时候不能使用open语句,fetch语句和close语句,否则会产生错误。
set serveroutput on;
decalre
cursor mycur(vartype number) is
select emp_no,emp_zc from cus_emp_basic
where com_no=var_type;
begin
for person in mycur(000627) loop
dbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc);
end loop;
end
java调用游标
CallableStatement cs=null;
cs=conn.prepareCall(sql);
cs.setInt(1,maxrow);
cs.setInt(2,minrow);
cs.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
rs=(ResultSet)cs.getObject(3);
-----------------进一步讲解游标
游标也叫光标,在关系型数据库中经常使用,在PL/SQL程序中可以用CURSOR与select一起对表或者视图中的数据进行查询并逐行读取
因为oracle不允许定义数组,查找出来的数据是一个大集合的话就需要使用游标进行遍历打印
-----使用步骤
1、定义;2打开;3、使用;4、关闭
演示如下
首先创建测试表student,脚本如下:
create table student(
STUNAME VARCHAR2(10),
STUNO VARCHAR2(4),
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
--显示游标使用,使用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;
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;
end;
end proc_stu2;
(3----------------)使用for循环处理游标
create or replace procedure proc_stu3 as
begin
declare
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;
end;
end proc_stu1_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;
--------------