Oracle笔记:循环及游标

循环及退出循环:

--while
--初值
while 条件
loop
  循环体;
  循环变量的变化;
end loop;

--break
if 条件 then
  exit;
end if;

--continue
<<label>>
....
if 条件 then
  goto label;
end if; 

--例
declare
  i integer;
  j integer;
begin  
  j:=1;
  <<b>>  
  while j<=9
  loop  
     i:=1;       
     <<a>>
     while i<=j  
     loop
       if i=3 then
         i:=i+1;
         j:=j+1;
         goto b; 
       end if;
       dbms_output.put(i||'*'||j||'='||i*j||'  ');
       i:=i+1; 
     end loop;
     dbms_output.put_line('');  
     j:=j+1;
  end loop ;
end;
游标的使用:

--游标
Result rs = stmt.excuteQuery();
while(rs.next())
{
  rs.getString(1);
}

select * from emp;
--游标:指向缓冲区数据行的一个指针(句柄)。
--指针就是存放地址的一个变量。
--用法:
1、声明(declare部分): 
   cursor 游标名 is 
   select语句块(标明了游标所指向的数据区域);
2、打开(begin end执行体中)
   open 游标名;
   (只有在打开游标时,select语句才真正执行,
    并把首行地址放入游标)
3、提取游标所指向的数据行(循环)
   fetch 游标名 into 指定变量(自行处理)

4、关闭游标
   close 游标名;
   
注意:
1、如果想再次使用被关闭的游标,可以重新开发游标。
2、游标是单向的。如果想重新访问开头的数据,只能
   关闭后重新打开使用。
3、重要属性: %found  %notfound(没有找到数据)
4、fetch同时完成两件事:
   1)移向下一行
   2)提取数据   
--例子  

declare
  v_emp emp%rowtype;
  cursor cur_emps is
   select * from emp;
begin
  open cur_emps;  
  loop
    fetch  cur_emps into v_emp;
    exit when cur_emps%notfound;
    dbms_output.put(v_emp.empno||' ');
    dbms_output.put(v_emp.ename||' ');
    dbms_output.put_line(v_emp.deptno);     
  end loop;
  close cur_emps;
end;

--游标类型的变量
declare
 cursor cur_emps is
   select empno,ename,sal,deptno from emp;   
 v_emp cur_emps%rowtype;
begin
  open cur_emps;  
  loop
    fetch  cur_emps into v_emp;
    exit when cur_emps%notfound;
    dbms_output.put(v_emp.empno||' ');
    dbms_output.put(v_emp.ename||' ');
    dbms_output.put_line(v_emp.deptno);     
  end loop;
  close cur_emps;
end;

--参数
declare
 cursor cur_emps(dept_no integer) is
   select empno,ename,sal,deptno from emp 
   where deptno=dept_no;   
 v_emp cur_emps%rowtype;
begin
  open cur_emps(20);  
  loop
    fetch  cur_emps into v_emp;
    exit when cur_emps%notfound;
    dbms_output.put(v_emp.empno||' ');
    dbms_output.put(v_emp.ename||' ');
    dbms_output.put_line(v_emp.deptno);     
  end loop;
  close cur_emps;
  
  open cur_emps(30);  
  loop
    fetch  cur_emps into v_emp;
    exit when cur_emps%notfound;
    dbms_output.put(v_emp.empno||' ');
    dbms_output.put(v_emp.ename||' ');
    dbms_output.put_line(v_emp.deptno);     
  end loop;
  close cur_emps;
end;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于大大大洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值