oracle 异常+存储过程+函数

--第一种异常
declare
  v_Num number;
begin
  v_Num := 10 / 0;
  exception
    when zero_divide then --捕获特定异常
       dbms_output.put_line('除数不能为零');
    when others then
       dbms_output.put_line('出错了');--捕获所有的异常
end;
--其应用:错误跟踪(缺陷跟踪)
declare
  v_trace varchar2(200);
  v_num number;
begin
  v_trace := '正在做第一个业务逻辑,错误编号:1001';
  v_num := 1234 - 435;
  v_trace := '正在做第二个业务逻辑,错误编号:1002';
  v_num := 56345 - 435;
  v_trace := '正在做第三个业务逻辑,错误编号:1003';
  v_num := 322 - 6786;
  when others then
       dbms_output.put_line('出错了');--用户自行决定是否需要提示
       -- insert into 日志表(v_trace......);
      
end;

--第二种异常:事先定义异常编号,后捕捉(也属于自定义异常)
declare
  v_UserExcept exception;
  pragma exception_init(v_UserExcept,-1476);
  v_Num number;
begin
  v_Num := 10 / 0;
  exception
     when v_UserExcept then
         dbms_output.put_line('除数不能为零');
end;
--第三种异常:自定义异常
declare
  v_num number;
  v_Except exception;
begin
  v_num := 20;
  if v_num > 10 then
     raise v_Except; -- 主动出发异常
  end if;
  exception
    when v_Except then
        dbms_output.put_line('出错了');
end;
--其应用:可以用作预警
declare
v_num number;
e_except exception;
begin
v_num:=15;
  if v_num>10 and v_num<20 then
    raise e_except;
  end if;
  exception
      when e_except then
        dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||' '||'某设备当前的指标为:'||to_char(v_num));
      when others then
        dbms_output.put_line(sqlcode||'-'||sqlerrm);
end;

 


--存储过程
declare
  v_num number;
begin
  v_num := 123;
end;

create or replace procedure GetName
is
  v_num number;
begin
  v_num := 123;
end;
--调用方法
--方法一:命令
SQL> execute GetName;

PL/SQL procedure successfully completed

SQL>

--方法二:程序
begin
  GetName;
end;


create or replace procedure GetName1(i_in_n_EmpNO in number)
is
  v_Name  varchar2(20);
begin
  select ename into v_Name from emp where empno=i_in_n_EmpNO;
  dbms_output.put_line(v_Name);
end;
--第一种调用方法
SQL> set serveroutput on
SQL> execute getname1(7369);

SMITH

PL/SQL procedure successfully completed

SQL>

--第二种调用方法
begin
  GetName1(7369);
end;

--out参数
create or replace procedure GetName2(i_in_n_EmpNO in number,i_out_c_Name out varchar2)
is
begin
  select ename into i_out_c_Name from emp where empno=i_in_n_EmpNO;
end;

--第一种调用方法
SQL> variable v_name varchar2(20);
SQL> execute getname2(7369,:v_name);

PL/SQL procedure successfully completed
v_name
---------
SMITH

SQL> select :v_name from dual;

:V_NAME
--------------------------------------------------------------------------------
SMITH
v_name
---------
SMITH

SQL>

--第二种调用方法
declare
  v_name varchar2(20);
begin
  GetName2(7369,v_name);
  dbms_output.put_line(v_name);
end;


--in out参数
create or replace procedure GetName3(i_inout_c_Name in out varchar2)
is
begin
  select ename into i_inout_c_Name from emp where empno=to_number(i_inout_c_Name);
end;
--调用方法
declare
  v_name varchar2(20);
begin
  v_name:= '7369';
  GetName3(v_name);
  dbms_output.put_line(v_name);
end;


--函数
declare
  v_num number;
begin
  v_num := 123;
end;

create or replace function getFuncName
return number
is
  v_num number;
begin
  v_num := 123;
  return v_num;
end;

--第一种调用方法
SQL> select getFuncName from dual;

GETFUNCNAME
-----------
        123

SQL>
--第二种调用方法
declare
  v_num number;
begin
  --select getFuncName into v_num from dual;
  v_num := getFuncName();
  dbms_output.put_line(v_num);
end;


create or replace function getFuncName1(i_in_n_EmpNO number)
return varchar2
is
  v_name varchar2(20);
begin
  select ename into v_Name from emp where empno=i_in_n_EmpNO;
  return v_name;
end;

--第一种调用方法
SQL> select getFuncName1(7369) from dual;

GETFUNCNAME1(7369)
--------------------------------------------------------------------------------
SMITH

SQL>
--第二种调用方法
declare
  v_name varchar2(20);
begin
  v_name := getFuncName1(7369);
  dbms_output.put_line(v_name);
end;

 

create or replace function getFuncName3(i_in_n_EmpNO in number,i_out_c_Name out varchar2)
return number
is
begin
  select ename into i_out_c_Name from emp where empno=i_in_n_EmpNO;
  return 1;
end;
--调用方法
declare
  v_name varchar2(20);
  v_num number;
begin
   v_num := getFuncName3(7369,v_name);
   dbms_output.put_line(v_name ||'  返回值:'|| to_char(v_num));
end;

 

create or replace function getFuncName4(i_inout_c_Name in out varchar2)
return number
is
begin
  select ename into i_inout_c_Name from emp where empno=to_number(i_inout_c_Name);
  return 1;
end;

--调用方法
declare
  v_name varchar2(20);
  v_num number;
begin
   v_name:= '7369';
   v_num := getFuncName4(v_name);
   dbms_output.put_line(v_name ||'  返回值:'|| to_char(v_num));
end;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值