Oracle游标

/*
游标的使用
*/
--1.简单的输出,不带参数
declare v_name tbyszz.tbyszz_zzmc%type;
        v_zznm tbyszz.tbyszz_zznm%type;
        v_zztype tbyszz%rowtype;
        cursor myCursor is select * from tbyszz;
Begin
        open myCursor;--打开游标
        fetch myCursor into v_zztype;
        while myCursor%found loop
          dbms_output.put_line(v_zztype.tbyszz_zznm);
          fetch myCursor into v_zztype;
        end loop;
        close myCursor;
End;
--2.游标参数的传递方法
declare v_name tbyszz.tbyszz_zzmc%type;
        v_zznm tbyszz.tbyszz_zznm%type;
        v_zztype tbyszz%rowtype;
        cursor myCursor1 is select * from tbyszz;
        cursor myCursor2(v_para_zznm tbyszz.tbyszz_zznm%type default '00000000') is select * from tbyszz where tbyszz_zznm=v_para_zznm;--华丰集团
Begin
  --游标1
  open myCursor1;
  loop --循环游标可以采用循环的三种方式  whiel和loop
       fetch myCursor1 into v_zztype;
       exit when myCursor1%notfound;
        dbms_output.put_line('游标1:组织名称 '||v_zztype.tbyszz_zzmc);
  end loop;
  close myCursor1;
  
  --游标2,带有一个默认参数,结果应该是华丰集团
  open myCursor2;
  fetch myCursor2 into v_zztype;
  while myCursor2%found loop
    dbms_output.put_line('游标2:组织名称 '||v_zztype.tbyszz_zzmc);
    fetch myCursor2 into v_zztype;
  end loop;
  close myCursor2;
  
  --重新打开游标2,赋值一个参数,00000002,得到的应该是销售合并公司
  open myCursor2('00000002');
  fetch myCursor2 into v_zztype;
  while myCursor2%found loop
   dbms_output.put_line('带参数的游标2:'||v_zztype.tbyszz_zzmc);
    fetch myCursor2 into v_zztype;
  end loop; 
  close myCursor2;
End;
--执行结果
/*
游标1:组织名称 华丰集团
游标1:组织名称 销售合并公司
游标1:组织名称 集团本部
游标1:组织名称 山东区域
游标1:组织名称 潍坊分公司
游标1:组织名称 泰安分公司
游标1:组织名称 抵销公司
游标1:组织名称 hf1
游标1:组织名称 xs1
游标1:组织名称 wf1
游标1:组织名称 jt1
游标2:组织名称 华丰集团
带参数的游标2:销售合并公司
*/
--游标的属性
/*
 Cursor_name%FOUND     布尔型属性,当最近一次提取游标操作FETCH成功则为 TRUE,否则为FALSE;
 Cursor_name%NOTFOUND   布尔型属性,与%FOUND相反;
 Cursor_name%ISOPEN     布尔型属性,当游标已打开时返回 TRUE;
 Cursor_name%ROWCOUNT   数字型属性,返回已从游标中读取的记录数
*/
declare v_zznm tbyszz.tbyszz_zznm%type;
        v_zzmc tbyszz.tbyszz_zzmc%type;
        v_zztype tbyszz%rowtype;
        cursor myCursor is select * from tbyszz;
Begin
        open myCursor;
        loop
          fetch myCursor into v_zztype;
          exit when myCursor%notfound;
               dbms_output.put_line('组织名称:'||v_zztype.tbyszz_zzmc||'  记录数:'||myCursor%rowcount);
        end loop;
        close myCursor;
End;
--基于游标的变量比记录更好使,不容易出错
declare 
        cursor myCursor is select tbyszz_zznm,tbyszz_zzmc from tbyszz;
        v_zztype myCursor%rowtype;--基于游标的变量
Begin
        open myCursor;
        loop
          fetch myCursor into v_zztype;
          exit when myCursor%notfound;
          dbms_output.put_line('名称:'||v_zztype.tbyszz_zzmc);
         end loop;
        close myCursor;
End;
--游标的For循环,自动执行Open,fetch,检查,Close操作
/*
    PL/SQL语言提供了游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能;当进入循环时,游标FOR循环语句自动打开游标,并提取第一行游标数据,当程序处理完当前所提取的数据而进入下一次循环时,游标FOR循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有数据行后结束循环,并自动关闭游标。
格式:
 
  FOR index_variable IN cursor_name[(value[, value]…)] LOOP
    -- 游标数据处理代码
  END LOOP;
 
其中:
index_variable为游标FOR 循环语句隐含声明的索引变量,该变量为记录变量,其结构与游标查询语句返回的结构集合的结构相同。在程序中可以通过引用该索引记录变量元素来读取所提取的游标数据,index_variable中各元素的名称与游标查询语句选择列表中所制定的列名相同。如果在游标查询语句的选择列表中存在计算列,则必须为这些计算列指定别名后才能通过游标FOR 循环语句中的索引变量来访问这些列数据。
注:不要在程序中对游标进行人工操作;不要在程序中定义用于控制FOR循环的记录。
*/
declare cursor myCursor is select tbyszz_zzmc,tbyszz_zznm from tbyszz;
        v_zztype myCursor%rowtype;
Begin
  for v_zztype in myCursor loop
    dbms_output.put_line('名称:'||v_zztype.tbyszz_zzmc);
  end loop;
End;
--游标For循环中使用子查询
Begin
  for myCursor in (select tbyszz_zzmc from tbyszz) loop
    dbms_output.put_line(myCursor.Tbyszz_Zzmc);
  end loop;
End;

--
select lpad(tbyszz_zzbh,40,'0') from tbyszz;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值