一个存储过程中的多个异常处理
/***************************************该过程中用到了多个异常处理,他们异常都会返回不同的值,其中包括一个自定义的异常处理.
[color=red]希望实现:[/color]每碰到一个异常,就认为是最后的输出参数,直接跳出过程,不再执行后面的语句.
[color=red]目前结果:[/color]输出参数v_result总是0,也就是最后一个执行语句;而不是出现第一个异常的时候,输出的v_result=-601,依次类推.
[color=red]请教一下,该怎么实现我想要的那种情况呢?[/color]
***************************************/
CREATE OR REPLACE PROCEDURE USER_CREATE
(
v_recom_user varchar2, --推荐人
v_create_user varchar2, --创建者
v_balance_user varchar2, --结算者
v_manage_user varchar2, --管理者
v_reg_email varchar2, --注册邮件
v_reg_pwd varchar2, --注册密码
v_reg_ip varchar2, --注册ip
v_reg_date date, --注册日期
v_user_id out number, --用户ID
v_result out varchar2 --结果返回参数
)
IS
v_recom_userid number(15);
v_create_userid number(15);
v_balance_userid number(15);
v_manage_userid number(15);
v_userid number(15);
v_count number(1):=0;
v_isid number(15);
MyException EXCEPTION;
BEGIN
v_result:=0;
begin
--检查创建者
SELECT REG_USER_ID INTO v_create_userid FROM USER_REGISTER WHERE REG_EMAIL = v_create_user;
[color=red] exception when no_data_found then
v_result:=-601;--创建者帐号不存在
END;[/color]
--检查推荐者
if v_recom_user is not null then
begin
SELECT REG_USER_ID INTO v_recom_userid FROM USER_REGISTER WHERE REG_EMAIL = v_recom_user;
[color=red] exception when no_data_found then
v_result:=-602;--推荐人帐号不存在
end;[/color]
end if;
--检查结算者
if v_balance_user is not null then
begin
SELECT REG_USER_ID INTO v_balance_userid FROM USER_REGISTER WHERE REG_EMAIL = v_balance_user;
[color=red] exception when no_data_found then
v_result:=-603;--结算者帐号不存在
end;[/color]
END IF;
--检查管理者
if v_manage_user is not null then
begin
SELECT REG_USER_ID INTO v_manage_userid FROM USER_REGISTER WHERE REG_EMAIL = v_manage_user;
[color=red] exception when no_data_found then
v_result:=-604;--管理者帐号不存在
end;[/color]
END IF;
--检查用户是否已经存在
--自定义异常
begin
SELECT COUNT(1) INTO v_count FROM USER_REGISTER WHERE REG_EMAIL = v_reg_email;
if v_count = 1 then
raise MyException;
end if;
[color=red] exception when MyException then
v_result:=-511;--重复[/color]
end;
--获取USERID
begin
SELECT IS_ID,IS_USER_ID INTO v_isid,v_userid
FROM (SELECT IS_ID,IS_USER_ID FROM USER_ID_SELECT ORDER BY SYS_GUID())
WHERE ROWNUM = 1;
[color=red] exception when no_data_found then
v_result:=-516;--获取失败[/color]
END;
SET TRANSACTION READ WRITE;-----创建事务
BEGIN
--删除已经分配的USERID
DELETE USER_ID_SELECT WHERE IS_ID = v_isid;
--插入注册信息
INSERT INTO USER_REGISTER(REG_USER_ID,REG_EMAIL,REG_USER_PWD,REG_IP,REG_DATE)
VALUES(v_userid,v_reg_email,v_reg_pwd,v_reg_ip,v_reg_date);
[color=red] EXCEPTION
WHEN OTHERS THEN
begin rollback;v_result:=-512; end;--RAISE_APPLICATION_ERROR(-20512,'数据库内部错误!');
END;[/color]
v_user_id := v_userid;
v_result:= 0;
commit;
END;
/ 函数里面的多个异常处理,可以实现不同的异常return不同的值CREATE OR REPLACE FUNCTION GTEL.FUNC_USER_CREATE
(
v_recom_user varchar2, --推荐人
v_create_user varchar2, --创建者
v_balance_user varchar2, --结算者
v_manage_user varchar2, --管理者
v_reg_email varchar2, --注册邮件
v_reg_pwd varchar2, --注册密码
v_reg_ip varchar2, --注册ip
v_reg_date date, --注册日期
v_user_id out number--用户ID
)
RETURN NUMBER-- 返回值的数据类型
IS
v_recom_userid number(15);
v_create_userid number(15);
v_balance_userid number(15);
v_manage_userid number(15);
v_userid number(15);
v_count number(1):=0;
v_isid number(15);
MyException EXCEPTION;
BEGIN
begin
--检查创建者
SELECT REG_USER_ID INTO v_create_userid FROM USER_REGISTER WHERE REG_EMAIL = v_create_user;
[color=red] exception when no_data_found then
RETURN(-601);--v_result := -601;--创建者帐号不存在
END;[/color]
--检查推荐者
if v_recom_user is not null then
[color=red] begin
SELECT REG_USER_ID INTO v_recom_userid FROM USER_REGISTER WHERE REG_EMAIL = v_recom_user;
exception when no_data_found then
RETURN(-602);--推荐人帐号不存在
end;[/color]
end if;
--检查结算者
if v_balance_user is not null then
[color=red] begin
SELECT REG_USER_ID INTO v_balance_userid FROM USER_REGISTER WHERE REG_EMAIL = v_balance_user;
exception when no_data_found then
RETURN(-603);--结算者帐号不存在
end;[/color]
END IF;
--检查管理者
if v_manage_user is not null then
[color=red] begin
SELECT REG_USER_ID INTO v_manage_userid FROM USER_REGISTER WHERE REG_EMAIL = v_manage_user;
exception when no_data_found then
RETURN(-604);--管理者帐号不存在
end;[/color]
END IF;
--检查用户是否已经存在
--自定义异常
begin
SELECT COUNT(1) INTO v_count FROM USER_REGISTER WHERE REG_EMAIL = v_reg_email;
if v_count = 1 then
raise MyException;
end if;
[color=red] exception when MyException then
RETURN(-511);--重复
end;[/color]
--获取USERID
begin
SELECT IS_ID,IS_USER_ID INTO v_isid,v_userid
FROM (SELECT IS_ID,IS_USER_ID FROM USER_ID_SELECT ORDER BY SYS_GUID())
WHERE ROWNUM = 1;
[color=red] exception when no_data_found then
RETURN(-516);--获取失败[/color]
END;
SET TRANSACTION READ WRITE;-----创建事务
BEGIN
--删除已经分配的USERID
DELETE USER_ID_SELECT WHERE IS_ID = v_isid;
--插入注册信息
INSERT INTO USER_REGISTER(REG_USER_ID,REG_EMAIL,REG_USER_PWD,REG_IP,REG_DATE)
VALUES(v_userid,v_reg_email,v_reg_pwd,v_reg_ip,v_reg_date);
[color=red] EXCEPTION
WHEN OTHERS THEN
begin return(-512);rollback; end; -- v_sys_error := SQLCODE;
END;[/color]
v_user_id := v_userid;
commit;
return(0);
END;
/ /*之前一直以为oracle的过程是没有return的,所以症结就在碰到异常退出过程
我试过把所有异常都在前面自定义,在前面出异常的地方,raise MyException,但是执行的时候会报错.提示是碰到异常没得到处理.
*/
CREATE OR REPLACE PROCEDURE USER_CREATE
(
v_recom_user varchar2, --推荐人
v_create_user varchar2, --创建者
v_balance_user varchar2, --结算者
v_manage_user varchar2, --管理者
v_reg_email varchar2, --注册邮件
v_reg_pwd varchar2, --注册密码
v_reg_ip varchar2, --注册ip
v_reg_date date, --注册日期
v_user_id out number, --用户ID
v_result out varchar2 --结果返回参数
)
IS
v_recom_userid number(15);
v_create_userid number(15);
v_balance_userid number(15);
v_manage_userid number(15);
v_userid number(15);
v_count number(1):=0;
v_isid number(15);
MyException EXCEPTION;
BEGIN
v_result:=0;
begin
--检查创建者
SELECT REG_USER_ID INTO v_create_userid FROM USER_REGISTER WHERE REG_EMAIL = v_create_user;
exception when no_data_found then
v_result:=-601;[color=red]return;[/color]--创建者帐号不存在
END;
--检查推荐者
if v_recom_user is not null then
begin
SELECT REG_USER_ID INTO v_recom_userid FROM USER_REGISTER WHERE REG_EMAIL = v_recom_user;
exception when no_data_found then
v_result:=-602;[color=red]return;[/color]--推荐人帐号不存在
end;
end if;
--检查结算者
if v_balance_user is not null then
begin
SELECT REG_USER_ID INTO v_balance_userid FROM USER_REGISTER WHERE REG_EMAIL = v_balance_user;
exception when no_data_found then
v_result:=-603;[color=red]return;[/color]--结算者帐号不存在
end;
END IF;
--检查管理者
if v_manage_user is not null then
begin
SELECT REG_USER_ID INTO v_manage_userid FROM USER_REGISTER WHERE REG_EMAIL = v_manage_user;
exception when no_data_found then
v_result:=-604;[color=red]return;[/color]--管理者帐号不存在
end;
END IF;
--检查用户是否已经存在
--自定义异常
begin
SELECT COUNT(1) INTO v_count FROM USER_REGISTER WHERE REG_EMAIL = v_reg_email;
if v_count = 1 then
raise MyException;
end if;
exception when MyException then
v_result:=-511;[color=red]return;[/color]--重复
end;
--获取USERID
begin
SELECT IS_ID,IS_USER_ID INTO v_isid,v_userid
FROM (SELECT IS_ID,IS_USER_ID FROM USER_ID_SELECT ORDER BY SYS_GUID())
WHERE ROWNUM = 1;
exception when no_data_found then
v_result:=-516;[color=red]return;[/color]--获取失败
END;
SET TRANSACTION READ WRITE;-----创建事务
BEGIN
--删除已经分配的USERID
DELETE USER_ID_SELECT WHERE IS_ID = v_isid;
--插入注册信息
INSERT INTO USER_REGISTER(REG_USER_ID,REG_EMAIL,REG_USER_PWD,REG_IP,REG_DATE)
VALUES(v_userid,v_reg_email,v_reg_pwd,v_reg_ip,v_reg_date);
EXCEPTION
WHEN OTHERS THEN
begin rollback;v_result:=-512; end;--RAISE_APPLICATION_ERROR(-20512,'数据库内部错误!');
END;
v_user_id := v_userid;
v_result:= 0;
commit;
END; CREATE OR REPLACE PROCEDURE USER_CREATE(V_RECOM_USER VARCHAR2, --推荐人
V_CREATE_USER VARCHAR2, --创建者
V_BALANCE_USER VARCHAR2, --结算者
V_MANAGE_USER VARCHAR2, --管理者
V_REG_EMAIL VARCHAR2, --注册邮件
V_REG_PWD VARCHAR2, --注册密码
V_REG_IP VARCHAR2, --注册ip
V_REG_DATE DATE, --注册日期
V_USER_ID OUT NUMBER, --用户ID
V_RESULT OUT VARCHAR2 --结果返回参数
) IS
V_RECOM_USERID NUMBER(15);
V_CREATE_USERID NUMBER(15);
V_BALANCE_USERID NUMBER(15);
V_MANAGE_USERID NUMBER(15);
V_USERID NUMBER(15);
V_COUNT NUMBER(1) := 0;
V_ISID NUMBER(15);
MYEXCEPTION EXCEPTION;
BEGIN
V_RESULT := 0;
BEGIN
BEGIN
--检查创建者
SELECT REG_USER_ID
INTO V_CREATE_USERID
FROM USER_REGISTER
WHERE REG_EMAIL = V_CREATE_USER;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_RESULT := -601; --创建者帐号不存在
RAISE;
END;
--检查推荐者
IF V_RECOM_USER IS NOT NULL THEN
BEGIN
SELECT REG_USER_ID
INTO V_RECOM_USERID
FROM USER_REGISTER
WHERE REG_EMAIL = V_RECOM_USER;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_RESULT := -602; --推荐人帐号不存在
RAISE;
END;
END IF;
--检查结算者
IF V_BALANCE_USER IS NOT NULL THEN
BEGIN
SELECT REG_USER_ID
INTO V_BALANCE_USERID
FROM USER_REGISTER
WHERE REG_EMAIL = V_BALANCE_USER;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_RESULT := -603; --结算者帐号不存在
RAISE;
END;
END IF;
--检查管理者
IF V_MANAGE_USER IS NOT NULL THEN
BEGIN
SELECT REG_USER_ID
INTO V_MANAGE_USERID
FROM USER_REGISTER
WHERE REG_EMAIL = V_MANAGE_USER;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_RESULT := -604; --管理者帐号不存在
RAISE;
END;
END IF;
--检查用户是否已经存在
--自定义异常
BEGIN
SELECT COUNT(1)
INTO V_COUNT
FROM USER_REGISTER
WHERE REG_EMAIL = V_REG_EMAIL;
IF V_COUNT = 1 THEN
RAISE MYEXCEPTION;
END IF;
EXCEPTION
WHEN MYEXCEPTION THEN
V_RESULT := -511; --重复
END;
--获取USERID
BEGIN
SELECT IS_ID, IS_USER_ID
INTO V_ISID, V_USERID
FROM (SELECT IS_ID, IS_USER_ID
FROM USER_ID_SELECT
ORDER BY SYS_GUID())
WHERE ROWNUM = 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_RESULT := -516; --获取失败
RAISE;
END;
SET TRANSACTION READ WRITE; -----创建事务
BEGIN
--删除已经分配的USERID
DELETE USER_ID_SELECT WHERE IS_ID = V_ISID;
--插入注册信息
INSERT INTO USER_REGISTER
(REG_USER_ID, REG_EMAIL, REG_USER_PWD, REG_IP, REG_DATE)
VALUES
(V_USERID, V_REG_EMAIL, V_REG_PWD, V_REG_IP, V_REG_DATE);
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK;
V_RESULT := -512;
END; --RAISE_APPLICATION_ERROR(-20512,'数据库内部错误!');
RAISE;
END;
V_USER_ID := V_USERID;
V_RESULT := 0;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
V_RESULT := V_RESULT;
END;
END;
/
页:
[1]