• Oracle 中Return 和exit的区别


    在Oracle存储过程中,使用Return 时,如果执行到Return语句,会跳出整个语句(如果是循环,会跳出整个循环),将不再执行,也就是结束了整个存储过程。

    下面就用一个例子来说明一下 ,这个存储过程是根据员工号,查出员工姓名,为了得到直接的效果,我在特定的地方进行了语句的打印,写的有点简单,忘大家谅解:

    CREATE OR REPLACE PROCEDURE pro_emp1
    ( v_eno  IN  NUMBER,
       v_resultcode        OUT NUMBER,
       v_resulterrinfo     OUT VARCHAR2
    ) 
    IS
       iv_eno  emp.empno%type ;
       iv_name emp.ename%type;
       
    BEGIN
         iv_eno:=v_eno;          ---- 把入参的变量赋给定义的变量
         v_resultcode :=-1;
       
          BEGIN 
              select ename into iv_name 
                          from emp 
                        where  empno=iv_eno;  
              dbms_output.put_line('雇员名:'||iv_name);  
           EXCEPTION
                 WHEN OTHERS THEN
                     v_resultcode:=SQLCODE;
                     v_resulterrinfo :='没有想要的雇员名 :' ||SQLERRM;
                     RETURN;             
         END;     
           
         BEGIN 
                dbms_output.put_line('执行到大Begin 中的小Begin 中了方法了'); 
         END;
         
          dbms_output.put_line('执行到大Begin的末尾了');
    END;  


    执行这条存储过程,查询不存在的员工,可以看到后面的Beign语句以及打印语句,将不在执行:

    SQL> var v_resultcode number;
    SQL> var v_resultinfo varchar2;
    SQL> exec pro_emp1 (7789,:v_resultcode,:v_resultinfo);
     
    PL/SQL procedure successfully completed
    v_resultcode
    ---------
    100
    v_resultinfo
    ---------
    没有想要的雇员名 :ORA-01403: 未找到数据  	

    输入可以查询到的员工号码:

    SQL> exec pro_emp1 (7788,:v_resultcode,:v_resultinfo);
     
    雇员名:SCOTT
    执行到大Begin 中的小Begin 中了方法了
    执行到大Begin的末尾了
     
    PL/SQL procedure successfully completed
    v_resultcode
    ---------
    -1
    v_resultinfo
    ---------

    下面是从网上摘来的,有兴趣的人可以看看:

     create or replace procedure Test5(o_cellphone in varchar2) is
    
        v_cellphone cc_quiz_stat.cellphone %type;
    
        v_name      cc_quiz_stat %rowtype;
    
        v_state     cc_quiz_stat.state %type;
    
        begin
    
        declare
    
        cursor cur_cc is
    
        select * from cc_quiz_stat;
    
        cursor cur_jc(v_n varchar2) is
    
        select state from cc_quiz_stat;
    
        begin
    
        open cur_cc;
    
        loop
    
        fetch cur_cc
    
        into v_name;
    
        exit when cur_cc%notfound;
    
        open cur_jc(o_cellphone);
    
        loop
    
        fetch cur_jc
    
        into v_state;
    
        exit when cur_jc %notfound;
    
        if (o_cellphone = v_name.cellphone) then
    
        return;
    
        else
    
        dbms_output.put_line('手机号' || v_name.cellphone || '省份' ||
    
        v_state);
    
        end if;
    
        end loop;
    
        close cur_jc;
    
        end loop;
    
        close cur_cc;
    
        end;
    
        end Test5;
    
    

    执行结果:

    手机号18900000000省份全国
    
        手机号18900000000省份南京
    
        手机号18900000000省份天津
    
        手机号18900000000省份 上海
    
        手机号18900000000省份北京
    
    


     

     create or replace procedure Test5(o_cellphone in varchar2) is
    
        v_cellphone cc_quiz_stat.cellphone %type;
    
        v_name      cc_quiz_stat %rowtype;
    
        v_state     cc_quiz_stat.state %type;
    
        begin
    
        declare
    
        cursor cur_cc is
    
        select * from cc_quiz_stat;
    
        cursor cur_jc(v_n varchar2) is
    
        select state from cc_quiz_stat;
    
        begin
    
        open cur_cc;
    
        loop
    
        fetch cur_cc
    
        into v_name;
    
        exit when cur_cc%notfound;
    
        open cur_jc(o_cellphone);
    
        loop
    
        fetch cur_jc
    
        into v_state;
    
        exit when cur_jc %notfound;
    
        if (o_cellphone = v_name.cellphone) then
    
        exit;
    
        else
    
        dbms_output.put_line('手机号' || v_name.cellphone || '省份' ||
    
        v_state);
    
        end if;
    
        end loop;
    
        close cur_jc;
    
        end loop;
    
        close cur_cc;
    
        end;
    
        end Test5;
    
    

    执行结果:

        手机号18900000000省份全国
    
        手机号18900000000省份南京
    
        手机号18900000000省份天津
    
        手机号18900000000省份 上海
    
        手机号18900000000省份北京
    
        手机号18900000002省份全国
    
        手机号18900000002省份南京
    
        手机号18900000002省份天津
    
        手机号18900000002省份 上海
    
        手机号18900000002省份北京
    
        手机号18900000003省份全国
    
        手机号18900000003省份南京
    
        手机号18900000003省份天津
    
        手机号18900000003省份 上海
    
        手机号18900000003省份北京
    
        手机号18900000004省份全国
    
        手机号18900000004省份南京
    
        手机号18900000004省份天津
    
        手机号18900000004省份 上海
    
        手机号18900000004省份北京
    
    


    return 跳出整个循环,本循环后面的不再执行,

    exit 跳出本次循环,下次继续执行本次循环


     

  • 相关阅读:
    [BZOJ3757] 苹果树
    [WC2013]糖果公园
    [SCOI2005]王室联邦
    luogu P2709 小B的询问
    [国家集训队]小Z的袜子
    [SDOI2009]HH的项链(莫队)
    [国家集训队]数颜色 / 维护队列(莫队)
    setting>SSH>sessions setting>勾选ssh Keepalive[ MobaXterm】设置保持SSH连接
    解决SSH自动断线,无响应的问题。
    Linux下使用bcwipe擦除磁盘空间
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300423.html
Copyright © 2020-2023  润新知