Erp100论坛's Archiver

xiangzhao 发表于 2008-7-12 22:58

一个存储过程中的多个异常处理

/***************************************
该过程中用到了多个异常处理,他们异常都会返回不同的值,其中包括一个自定义的异常处理.
[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;
/

xiangzhao 发表于 2008-7-12 22:59

函数里面的多个异常处理,可以实现不同的异常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;
/

xiangzhao 发表于 2008-7-12 22:59

/*之前一直以为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;

xiangzhao 发表于 2008-7-12 23:00

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]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.