Oracle --登陸

create or replace procedure SP_LOGIN(i_account        in t_account.acc_id%type, --登陸帳號
                                     i_password       in t_account.password%type, --登陸密碼
                                     o_cur_resultInfo out sys_refcursor, --登錄成功返回消息
                                     o_errNumber      out integer) --錯誤碼
 is
  --帳號表數據
  l_rtyAccount t_account%rowtype;
  --區域表數據
  l_zoneData t_zone%rowtype;
  --經銷商數據
  l_fchsData t_franchiser%rowtype;
  --門店數據
  l_storeData t_store%rowtype;
  --銷售員數據
  l_selrData t_seller%rowtype;
  --異常
  l_exception exception;
  --錯誤消息
  l_error_msg varchar2(100);
  /**********
  *creater:       lxl
  *craeateTime:   2015-07-23
  *function:      Login
  **********/
begin
  /******
  errorNumber 
  0:登陸成功
  1:帳號不存在
  2:帳號存在但無效
  3:密碼不正確
  4:總部登陸查詢出錯
  5:區域狀態錯誤
  6:經銷商登陸查詢出錯
  7:門店登陸查詢出錯
  8:銷售員登陸查詢出錯
  9:登陸異常
  *******/
  pkg_utility.sp_writeLog(i_log_type => 'INFO',
                          i_acc_id   => i_account,
                          i_sp_name  => 'SP_LOGIN',
                          i_log_desc => '開始');

  o_errNumber := PKG_CONSTANTS.C_RTN_SUCCESS;
  l_error_msg := '';

  --1.判斷帳號是否存在且啓用
  begin
    select *
      into l_rtyAccount
      from t_account
     where acc_id = trim(i_Account);
  exception
    when no_data_found then
      --帳號不存在
      o_errNumber := 1;
      l_error_msg := '帳號不存在';
    
      --在這裏加個異常處理,處理遊標值
      raise l_exception;
  end;

  --2.判斷帳號是否已啓用
  if l_rtyAccount.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
    o_errNumber := 2;
    l_error_msg := '帳號無效';
  
    --在這裏加個異常處理,處理遊標值
    raise l_exception;
  end if;

  --3.判斷密碼是否正確可用用輸入的密碼和原密碼相比較
  if l_rtyAccount.Password != trim(i_password) then
    o_errNumber := 3;
    l_error_msg := '密碼錯誤';
  
    --在這裏加個異常處理,處理遊標值
    raise l_exception;
  end if;

  --4.帳號正確,密碼正確
  /***
  直接判斷操做狀態便可
  0:總部
  1:經銷商
  2:門店
  3:銷售員
  ***/
  --總部
  if l_rtyAccount.Role_Type = PKG_CONSTANTS.C_ROLETYPE_HEAD then
    begin
      open o_cur_resultInfo for
        select acc_id as accId,
               role_type as roleType,
               role_id as roleId,
               status as status,
               spcl_acc_flg as spclAccFlag,
               '' as zoneId,
               '' as zoneName,
               '' as zoneState,
               '' as fchsId,
               '' as fchsName,
               '' as fchsContacts,
               '' as fchsTelephone1,
               '' as fchsTelephone2,
               '' as fchsState,
               '' as storeId,
               '' as storeName,
               '' as storeAddr,
               '' as storeContacts,
               '' as storeTelephone1,
               '' as storeTelephone2,
               '' as storeState,
               '' as sellerId,
               '' as sellerName,
               '' as sellerTelephone,
               '' as sellerState
          from t_account
         where acc_id = trim(i_account)
           and status = PKG_CONSTANTS.C_STATUS1_ENABLE
           and password = trim(i_password);
    exception
      when others then
        --總部登陸查詢出錯
        o_errNumber := 4;
        l_error_msg := '總部登陸查詢出錯';
    end;
    --經銷商
  elsif l_rtyAccount.Role_Type = PKG_CONSTANTS.C_ROLETYPE_FCHS then
    begin
      --1.根據角色代碼去經銷商表取數據
      select *
        into l_fchsData
        from t_franchiser tf
       where tf.fchs_id = l_rtyAccount.Role_Id;
    
      --2.判斷經銷商狀態是否可用
      if l_fchsData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
        o_errNumber := 6;
        l_error_msg := '經銷商狀態不可用';
      
        --在這裏加個異常處理,處理遊標值
        raise l_exception;
      else
        --查詢區域全部數據
        begin
          select *
            into l_zoneData
            from t_zone tz
           where tz.zone_id = l_fchsData.Zone_Id;
        
          --判斷區域狀態是否可用
          if l_zoneData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
            o_errNumber := 5;
            l_error_msg := '區域狀態不可用';
          
            --在這裏加個異常處理,處理遊標值
            raise l_exception;
          else
            begin
              --返回數據
              open o_cur_resultInfo for
                SELECT TA.acc_id as accId,
                       TA.role_type as roleType,
                       ta.role_id as roleId,
                       TA.status as status,
                       TA.spcl_acc_flg as spclAccFlag,
                       TZ.zone_id as zoneId,
                       TZ.zone_name as zoneName,
                       TZ.status as zoneState,
                       TF.fchs_id as fchsId,
                       TF.fchs_name as fchsName,
                       TF.contacts as fchsContacts,
                       TF.telephone1 as fchsTelephone1,
                       TF.telephone2 as fchsTelephone2,
                       TF.status as fchsState,
                       '' as storeId,
                       '' as storeName,
                       '' as storeAddr,
                       '' as storeContacts,
                       '' as storeTelephone1,
                       '' as storeTelephone2,
                       '' as storeState,
                       '' as sellerId,
                       '' as sellerName,
                       '' as sellerTelephone,
                       '' as sellerState
                  FROM T_zone tz, t_franchiser tf, t_account ta
                 WHERE TZ.zone_id = l_fchsData.Zone_Id
                   and tz.status = PKG_CONSTANTS.C_STATUS1_ENABLE
                   AND TF.fchs_id = l_rtyAccount.Role_Id
                   and tf.status = PKG_CONSTANTS.C_STATUS1_ENABLE
                   and TA.acc_id = trim(i_account)
                   and TA.status = PKG_CONSTANTS.C_STATUS1_ENABLE
                   and TA.password = trim(i_password);
            exception
              when others then
                --經銷商登陸查詢出錯
                o_errNumber := 6;
                l_error_msg := '經銷商登陸查詢出錯';
            end;
          end if;
        end;
      end if;
    end;
    --門店
  elsif l_rtyAccount.Role_Type = PKG_CONSTANTS.C_ROLETYPE_STORE then
    begin
    
      --1.根據角色代碼去門店表取數據
      select *
        into l_storeData
        from t_store ts
       where ts.store_id = l_rtyAccount.Role_Id;
    
      --2.判斷門店狀態是否可用
      if l_storeData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
        o_errNumber := 7;
        l_error_msg := '門店狀態不可用';
      
        raise l_exception;
      else
        begin
          --3.查詢經銷商數據
          select *
            into l_fchsData
            from t_franchiser tf
           where tf.fchs_id = l_storeData.Fchs_Id;
        
          --判斷經銷商狀態
          if l_fchsData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
            o_errNumber := 6;
            l_error_msg := '經銷商狀態不可用';
          
            raise l_exception;
          else
            --查詢區域全部數據
            begin
              select *
                into l_zoneData
                from t_zone tz
               where tz.zone_id = l_fchsData.Zone_Id;
            
              --判斷區域狀態是否可用
              if l_zoneData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
                o_errNumber := 5;
                l_error_msg := '區域狀態不可用';
              
                raise l_exception;
              else
                begin
                  open o_cur_resultInfo for
                    SELECT TA.acc_id as accId,
                           TA.role_type as roleType,
                           TA.role_id as roleId,
                           TA.status as status,
                           TA.spcl_acc_flg as spclAccFlag,
                           TZ.zone_id as zoneId,
                           TZ.zone_name as zoneName,
                           TZ.status as zoneState,
                           TF.fchs_id as fchsId,
                           TF.fchs_name as fchsName,
                           TF.contacts as fchsContacts,
                           TF.telephone1 as fchsTelephone1,
                           TF.telephone2 as fchsTelephone2,
                           TF.status as fchsState,
                           TSR.STORE_ID as storeId,
                           TSR.STORE_NAME as storeName,
                           TSR.STORE_ADDR as storeAddr,
                           TSR.CONTACTS as storeContacts,
                           TSR.TELEPHONE1 as storeTelephone1,
                           TSR.TELEPHONE2 as storeTelephone2,
                           TSR.STATUS as storeState,
                           '' as sellerId,
                           '' as sellerName,
                           '' as sellerTelephone,
                           '' as sellerState
                      FROM t_zone       tz,
                           t_franchiser tf,
                           t_store      tsr,
                           t_account    ta
                     WHERE TZ.zone_id = l_fchsData.Zone_Id
                       AND TZ.STATUS = PKG_CONSTANTS.C_STATUS1_ENABLE
                       AND TF.fchs_id = l_storeData.Fchs_Id
                       AND TF.STATUS = PKG_CONSTANTS.C_STATUS1_ENABLE
                       AND tsr.store_id = l_rtyAccount.Role_Id
                       AND TSR.STATUS = PKG_CONSTANTS.C_STATUS1_ENABLE
                       and TA.acc_id = trim(i_account)
                       and TA.status = PKG_CONSTANTS.C_STATUS1_ENABLE
                       and TA.password = trim(i_password);
                exception
                  when others then
                    --門店登陸查詢出錯
                    o_errNumber := 7;
                    l_error_msg := '門店登陸查詢出錯';
                end;
              end if;
            end;
          end if;
        end;
      end if;
    end;
    --銷售員
  elsif l_rtyAccount.Role_Type = PKG_CONSTANTS.C_ROLETYPE_SELLER then
    begin
      --1.根據銷售員代碼去門店表取數據
      select *
        into l_selrData
        from t_seller tsr
       where tsr.selr_id = l_rtyAccount.Role_Id;
    
      --2.判斷銷售員狀態是否可用
      if l_selrData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
        o_errNumber := 8;
        l_error_msg := '銷售員狀態不可用';
      
        raise l_exception;
      else
        begin
          --查詢門店數據
          --1.根據角色代碼去門店表取數據
          select *
            into l_storeData
            from t_store ts
           where ts.store_id = l_selrData.Store_Id;
        
          --2.判斷門店狀態是否可用
          if l_storeData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
            o_errNumber := 7;
            l_error_msg := '門店狀態不可用';
          
            raise l_exception;
          else
            begin
              --3.查詢經銷商數據
              select *
                into l_fchsData
                from t_franchiser tf
               where tf.fchs_id = l_storeData.Fchs_Id;
            
              --判斷經銷商狀態
              if l_fchsData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
                o_errNumber := 6;
                l_error_msg := '經銷商狀態不可用';
              
                raise l_exception;
              else
                --查詢區域全部數據
                begin
                  select *
                    into l_zoneData
                    from t_zone tz
                   where tz.zone_id = l_fchsData.Zone_Id;
                
                  --判斷區域狀態是否可用
                  if l_zoneData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then
                    o_errNumber := 5;
                    l_error_msg := '區域狀態不可用';
                  
                    raise l_exception;
                  else
                    begin
                      open o_cur_resultInfo for
                        SELECT TA.acc_id as accId,
                               TA.role_type as roleType,
                               ta.role_id as roleId,
                               TA.status as status,
                               TA.spcl_acc_flg as spclAccFlag,
                               TZ.zone_id as zoneId,
                               TZ.zone_name as zoneName,
                               TZ.status as zoneState,
                               TF.fchs_id as fchsId,
                               TF.fchs_name as fchsName,
                               TF.contacts as fchsContacts,
                               TF.telephone1 as fchsTelephone1,
                               TF.telephone2 as fchsTelephone2,
                               TF.status as fchsState,
                               TSR.STORE_ID as storeId,
                               tsr.STORE_NAME as storeName,
                               TSR.STORE_ADDR as storeAddr,
                               TSR.CONTACTS as storeContacts,
                               TSR.TELEPHONE1 as storeTelephone1,
                               TSR.TELEPHONE2 as storeTelephone2,
                               TSR.STATUS as storeState,
                               TS.SELR_ID as sellerId,
                               TS.SELR_NAME as sellerName,
                               TS.TELEPHONE as sellerTelephone,
                               TS.STATUS as sellerState
                          FROM T_zone       tz,
                               t_franchiser tf,
                               t_store      tsr,
                               t_seller     ts,
                               t_account    ta
                         WHERE TZ.zone_id = l_fchsData.Zone_Id
                           AND TZ.STATUS = PKG_CONSTANTS.C_STATUS1_ENABLE
                           AND TF.fchs_id = l_storeData.Fchs_Id
                           AND TF.STATUS = PKG_CONSTANTS.C_STATUS1_ENABLE
                           AND tsr.store_id = l_selrData.Store_Id
                           AND TSR.STATUS = PKG_CONSTANTS.C_STATUS1_ENABLE
                           AND TS.selr_id = l_rtyAccount.Role_Id
                           AND TS.STATUS = PKG_CONSTANTS.C_STATUS1_ENABLE
                           and TA.acc_id = trim(i_account)
                           and TA.status = PKG_CONSTANTS.C_STATUS1_ENABLE
                           and TA.password = trim(i_password);
                    exception
                      when others then
                        --銷售員登陸查詢出錯
                        o_errNumber := 8;
                        l_error_msg := '銷售員登陸查詢出錯';
                    end;
                  end if;
                end;
              end if;
            end;
          end if;
        end;
      end if;
    end;
  end if; --總部 

  pkg_utility.sp_writeLog(i_log_type => 'INFO',
                          i_acc_id   => i_account,
                          i_sp_name  => 'SP_LOGIN',
                          i_log_desc => '結束');
exception
  when l_exception then
    --異常時也須要向遊標裏面裝值
    open o_cur_resultInfo for
      select '' as accId,
             '' as roleType,
             '' as roleId,
             '' as status,
             '' as spclAccFlag,
             '' as zoneId,
             '' as zoneName,
             '' as zoneState,
             '' as fchsId,
             '' as fchsName,
             '' as fchsContacts,
             '' as fchsTelephone1,
             '' as fchsTelephone2,
             '' as fchsState,
             '' as storeId,
             '' as storeName,
             '' as storeAddr,
             '' as storeContacts,
             '' as storeTelephone1,
             '' as storeTelephone2,
             '' as storeState,
             '' as sellerId,
             '' as sellerName,
             '' as sellerTelephone,
             '' as sellerState
        from dual --這裏用dual不用其它的表,由於dual裏面確定有一條記錄,而其它的表不必定會有一條記錄
       where rownum = 1;
  
  when others then
    o_errNumber := 9;
    l_error_msg := '登陸異常';
    pkg_utility.sp_writeLog(i_log_type => 'ERROR',
                            i_acc_id   => i_account,
                            i_sp_name  => 'SP_LOGIN',
                            i_log_desc => l_error_msg);
end SP_LOGIN;
相關文章
相關標籤/搜索