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;