重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
--设:要抛出的异常叫做ex_no_data,要判断是否小于0的变量为:v_data,则:
专注于为中小企业提供网站制作、做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业宁安免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
DECLARE
--声明异常
ex_no_data EXCEPTION; -- Exception to indicate an error condition
v_data NUMBER; -- Variable to hold data
--v_ErrorCode NUMBER; -- Variable to hold the error message code
--v_ErrorText VARCHAR2(200); -- Variable to hold the error message text
BEGIN
--抛出异常
IF v_data 0 THEN --(括号内填抛出异常的条件)
RAISE ex_no_data;
END IF;
--捕捉异常
EXCEPTION
WHEN ex_no_data THEN
dbms_output.put_line(v_data);
--捕捉其他异常,并获得 捕获异常的内容
WHEN OTHERS THEN
null;
-- v_ErrorCode := SQLCODE;
-- v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- 注意这里用SUBSTR 来截取错误消息
--dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/
---另可参考我之前的一个帖子:
先建一个错误跟踪表
create sequence s_error_id;
CREATE TABLE ERROR_RECORD
(
ERROR_ID NUMBER(10) primary key,
ERROR_CODE NUMBER(10),
ERROR_MSG VARCHAR2(2000),
ERROR_DATE DATE,
ERROR_PROGRAM VARCHAR2(200)
);
--------在过程的例外里向跟踪表写入错误信息:
create or replace procedure day_task is
v_sqlcode ERROR_RECORD.ERROR_CODE%type;
v_msg ERROR_RECORD.error_msg%type;
begin
------program body
exception when others then
--记录错误信息表
v_sqlcode :=sqlcode;
v_msg :=sqlerrm;
insert into error_record(error_code,error_msg,error_date,error_program)
values (v_sqlcode,v_msg,sysdate,‘day_task’);
end;
begin
select into ......................;
exception
when errorException then
.................
when others then
..................
end;
db2中类似oracle的异常捕获写法:
举例如下:
CREATE PROCEDURE OUT_LANGUAGE (...,OUT returnCode INTEGER, OUT returnMsg CHAR(32))
-- returnCode 返回执行中的的错误代码
-- returnMsg 返回执行中的的错误描述
SPECIFIC SQL_OUT_LANGUAGE
LANGUAGE SQL
BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT ´00000´;
DECLARE errorLabel CHAR(32) DEFAULT ´´;
......
-- in case of no data found
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET returnCode = SQLCODE;
-- 也可以设置为 SET returnCode = 0; 因为这个DECLARE是为了忽略NOT FOUND的执行结果
END;
-- in case of SQL error
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET returnCode = SQLCODE;
SET returnMsg = errorLabel;
END;
你说的异常是什么意思?如果是,执行中的错误,那么可以用“调试”,不过需要有一个系统权限的拥护才能调试,权限好象是什么debug XXXXX。
如果说的是有时执行因为这样那样的数据问题出现的异常,那么一般都是通过exception来抛出异常的,这样的抛出的异常,你可以自己编代码,然后输入一张表内,这样就可以捕获异常了。如果1表示没有主键,2表示数据超长等等。具体的写法网上很多,这里就不写了。
当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
对于这类异常情况的处理,步骤如下:
1、在PL/SQL 块的定义部分定义异常情况:
异常情况 EXCEPTION;
2、RAISE 异常情况;
3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
例:更新指定员工工资,增加100;
DECLARE
v_empno employees.employee_id%TYPE :=empno;
no_result EXCEPTION;
BEGIN
UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
IF SQL%NOTFOUND THEN
RAISE no_result;
END IF;
EXCEPTION
WHEN no_result THEN
DBMS_OUTPUT.PUT_LINE('数据更新语句失败了!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
1、弹出错误框:
示例代码:
declare
v_count number;
begin
select count(*) into v_count from dept;
if v_count 10 then
raise_application_error(-20001,'数量小于10');
end if;
end;
执行结果:
2、控制台显示:
示例代码:
declare
v_count number;
my_exp exception;
begin
select count(*) into v_count from dept;
if v_count 10 then
raise my_exp;
end if;
exception
when my_exp then
dbms_output.put_line('数量小于10');
when others then
dbms_output.put_line('其他异常');
end;
执行结果:
PS:ORACLE 用户自定义异常小例子:
CREATE OR REPLACE PROCEDURE test_Exception_byLeejin
(
ParameterA IN varchar,
ParameterB IN varchar,
ErrorCode OUT varchar --返回值,错误编码
)
AS
/*以下是一些变量的定义*/
V NUMBER;
V nvarchar();
V NUMBER;
APP_EXP EXCEPTION; --自定义异常
BEGIN
ErrorCode :='';
IF (ParameterA=ParameterB) THEN
ErrorCode := 'ParameterA = ParameterB';
RAISE APP_EXP; -- 抛出异常
END IF;
EXCEPTION
WHEN APP_EXP THEN --在处理异常
RAISE_APPLICATION_ERROR(-,ErrorCode);
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-,'未知异常');
END;