--第一种异常
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;