oracle_循环loop, 游标cursor

LOOP(循环):
declare   
    l_i number:=1;  --循环变量.
    begin
      --循环1到10里面的数据.
      for i in reverse 1..10 loop --reverse 可控制倒序循环   
        dbms_output.put_line(to_char(sysdate,'HH24:mi:ss'));   
        dbms_output.put_line(i);   
      end loop;   
     --循环表里查出来的数据.   
     for i in(select rownum from user_objects uo where rownum<10) loop 
       dbms_output.put_line(to_char(sysdate,'HH24:mi:ss'));
       dbms_output.put_line(i.rownum);    --此时的i是一个对像.你可以选择对像的属性.
      end loop;   
      
      --while循环.为false就退出循环.
      while l_i!=11 loop   
        dbms_output.put_line(l_i);   
        l_i:=l_i+1;   
      end loop;   
        
        --给循环添加退出条件.
      l_i:=1;   
      loop   
        --eixt; 可以跳出当前循环.
        exit when l_i=10;   --循环退出条件.
        dbms_output.put_line(l_i);   
        l_i:=l_i+1;   
      end loop;   
end;  


CURSOR(游标):

--游标不能打开多次.
-- %NOTFOUND  执行行没有找到。  
-- %FOUND  执行行找到  
-- %ROWCOUNT 游标影响行数  
-- %ISOPEN  当前游标是否打开 

CREATE OR REPLACE PROCEDURE test_cursor(
  i_name IN user_data_base.user_data_name%TYPE   --传入名字
) IS
   CURSOR v_refcursor IS SELECT t.user_data_id, t.user_data_nick
      FROM user_data_base t WHERE t.user_data_name = i_name;  --游标查询语句
   
   v_gid user_data_base.user_data_id%TYPE;
   v_nick user_data_base.user_data_nick%TYPE;
   
BEGIN
  
  IF v_refcursor%ISOPEN THEN      --打开时先验证是否打开过.
     CLOSE v_refcursor;
  END IF;

  OPEN v_refcursor;     --打开游标.打开游标才会执行上面的SELECT语句.
  
  dbms_output.put_line(v_refcursor%ROWCOUNT);
  
  LOOP
    FETCH v_refcursor
    INTO v_gid, v_nick; --把游标的值写入变量.
    
    EXIT WHEN v_refcursor%NOTFOUND; --没找到数据.退出条件.
    
    dbms_output.put_line(v_refcursor%ROWCOUNT);    --%ROWCOUNT是当前影响行数. 类似for里的i
    
    dbms_output.put_line('ID:'||v_gid||' NICK:'||v_nick);
  END LOOP;
  CLOSE v_refcursor;   --关闭游标.
  
END;


定义和初始化分开:
CREATE OR REPLACE PROCEDURE test_cursor(
  i_name IN user_data_base.user_data_name%TYPE   --传入名字
) IS
   TYPE t_cursor IS REF CURSOR;   --定义游标类型.
   v_cursor t_cursor;         --定放游标   
   
BEGIN
  
  IF NOT v_cursor%ISOPEN THEN
       OPEN v_cursor FOR SELECT t.user_data_id, t.user_data_nick
            FROM user_data_base t WHERE t.user_data_name = i_name;
  END IF;

END;



返回系统游标:
CREATE OR REPLACE PROCEDURE test_cursor(
  v_cursor OUT SYS_REFCURSOR          --返回系统游标
) IS
BEGIN
  
  OPEN v_cursor FOR
    SELECT t.gid
      FROM TEST_TBL t WHERE t.name = 'AAA';

END;

一,continue

在oracle11g以前无法使用continue实现退出当前循环(11g中据说实现了),但是可以用以下方法模拟实现:

declare 
--定义变量
begin
     for i in 1..10 loop --真正的循环
         for j in 1..1 loop --假循环,目的是模拟出continue效果
             if i = 6 then
                exit;--这个exit相当于continue
             end if ;
             dbms_output.put_line(i);
         end loop ;
     end loop;

     dbms_output.put_line('over');
end ;

在oracle11g中可以用以下方式实现:

declare 
--定义变量
begin
     for i in 1..10 loop --真正的循环
       if i = 6 then
         continue;--用if语句和continue实现
       end if ;
       dbms_output.put_line(i);
     end loop;
     
     dbms_output.put_line('over');
end ;

declare
--定义变量
begin
     for i in 1..10 loop --真正的循环
       continue when i = 6;--用continue when实现
       dbms_output.put_line(i);
     end loop;
     
     dbms_output.put_line('over');
end ;

二,break

oracle中并没有break关键字,但是可以用exit关键字来代替break实现退出循环

declare
--定义变量
begin
     for i in 1..10 loop
         if i > 6 then
            exit ;--退出循环,相当于break
         end if ;
         dbms_output.put_line(i);
     end loop ;
     
     dbms_output.put_line('over');
end ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值