oracle 游标

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;

--------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值