您的当前位置:首页正文

Oracle中Return和exit的区别

2020-11-09 来源:爱够旅游网

在Oracle存储过程中, 使用Return 时 ,如果执行到Return语句,会跳出整个语句(如果是循环,会跳出整个循环),将不再执行, 也就是结束了整个存储过程。 下面就用一个例子来说明一下 ,这个存储过程是根据员工号,查出员工姓名,为了得到直接的效果,我在

在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 跳出本次循环,下次继续执行本次循环

显示全文