2015-11-01 92 views
0

我的應用程序有以下兩個處理整個事務的過程。 但是,當我的嵌套過程拋出異常時,在外部過程中執行的CRUD操作無法回滾。請幫我重新安排它,或者我怎樣才能以更好的方式書寫,以便我可以回退我的交易。異常處理PL SQL

PROCEDURE SP_SEND_CASE_NEXT_LEVEL 
(
    p_wfId IN NUMBER, 
    p_assessmentId  IN NUMBER, 
    p_prevLevelId  IN NUMBER, 
    p_appType   IN NUMBER, 
    p_sequenceNumber IN NUMBER, 
    p_subSequenceNumber IN NUMBER, 
    p_userCode   IN VARCHAR2, 
    p_companyCode  IN VARCHAR2, 
    p_camNumber   IN VARCHAR2, 
    p_reviewType  IN NUMBER, 
    p_unitType   IN NUMBER, 
    p_regionCode  IN NUMBER, 
    p_caseType   IN VARCHAR2, 
    p_isApproved  IN VARCHAR2, 
    p_fromUserCode  IN VARCHAR2, 
    P_ERRORDETAIL  OUT VARCHAR2 
) IS 

    V_Newlevelid   NUMBER(8); 
    V_NewWfId    NUMBER(8); 
    v_StepCompleted  NUMBER(2); 
    v_caseComplete   VARCHAR2(1); 
    v_isStepComplete  VARCHAR2(1); 
    v_isCompanyPicked  VARCHAR2(1); 
    v_subUserInWorkflow NUMBER(1); 
    v_isPresent   NUMBER(1); 
    v_inConsistentWorkFlow VARCHAR2(2); 
    v_subUserCode   VARCHAR2(8); 
    v_errmsg    VARCHAR2(50); 
    v_userDP    NUMBER(10, 2); 
    v_sql     VARCHAR2(2000); 
    v_sub_seq_no   NUMBER(8); 
    v_reversalSequenceNo NUMBER(4); 
    v_reversalAppType  NUMBER(2); 
    v_NewCourierId  NUmber(8); 
    v_courierCount   NUMBER(1); 
    v_revSequenceNo  NUMBER(4); 
    v_courierComments VARCHAR2(4000); 
    v_required_count NUMBER(2); 
    v_sessionPriority NUMBER(1); 
    v_customRequiredCount NUMBER(1); 
BEGIN 
    p_errorDetail   := 'Failure'; 
    v_inConsistentWorkFlow := 'N'; 
    v_reversalAppType  := 0; 
    v_revSequenceNo   :=0; 
    v_courierComments := ''; 
    v_customRequiredCount := 0; 
    SAVEPOINT Start_Tran; 
    BEGIN 

    -- update aph_comp_leveldetails for initiator of case 
    UPDATE Aph_Comp_Leveldetails 
     SET Case_Complete = 'Y', 
      End_Date   = Sysdate, 
      Is_Step_Complete = 'Y', 
      is_approved  = p_isApproved 
    WHERE User_Code = p_userCode 
     AND Assessmentid = p_assessmentId 
     and levelid = p_prevlevelid; 

    -- update Aph_Comp_Header for case status 
    UPDATE Aph_Comp_Header 
     SET CASE_STATUS_DESC = 'Pending', 
     COMP_REVERSE = 'N'   
    WHERE Assessmentid = p_assessmentId; 

    -- update MST_TAT_CALC set case end time for previous level user 
    UPDATE MST_TAT_CALC 
     SET CASE_END_TIME = sysdate, 
     RULE_END_TIME = sysdate, 
     days = fn_get_days(RULE_START_TIME, sysdate, REASON) 
    WHERE User_Code = p_userCode -- TODO : to be removed 
     and LEVELID = p_prevLevelId 
     AND ASSESSMENTID = p_assessmentId 
     and reason <> 'C' and CASE_END_TIME is null; 
    ------------------------------------------------------------------------------------------------- 
    ------------------------------------------------------------------------------------------------- 

    SELECT COUNT(CASE_COMPLETE) into v_required_count 
    FROM APH_COMP_LEVELDETAILS 
    WHERE ASSESSMENTID = p_assessmentid 
    AND SEQ_NO   = p_sequenceNumber 
    AND APP_TYPE  = p_appType 
    and COMP_REVERSE = 'N' 
    and COMP_WITHDRAWN = 'N' 
    and COMP_REJECTED = 'N'; 

    SELECT COUNT(CASE_COMPLETE) into v_StepCompleted 
    FROM APH_COMP_LEVELDETAILS 
    WHERE ASSESSMENTID = p_assessmentid 
    AND SEQ_NO   = p_sequenceNumber 
    AND APP_TYPE  = p_appType 
    AND CASE_COMPLETE = 'Y' 
    and COMP_REVERSE = 'N' 
    and COMP_WITHDRAWN = 'N' 
    and COMP_REJECTED = 'N'; 



          BEGIN 
           -- aph_comp_leveldetails 
           INSERT INTO aph_comp_leveldetails 
           (WF_ID, 
           ASSESSMENTID, 
           LEVELID, 
           User_Code, 
           Case_Complete, 
           COMP_FROMUSER, 
           SEQ_NO, 
           SUB_SEQ_NO, 
           COMP_TOUSER, 
           Start_Date, 
           IS_STEP_COMPLETE, 
           Is_Company_Picked, 
           App_Type, 
           WORK_FLOW_USER) 
           VALUES 
           (Send.Wf_Id, 
           p_assessmentId, 
           V_Newlevelid, 
           USER_ON_HOLIDAY.User_code, 
           'N', 
           --send.user_id, 
           P_USERCODE, 
           Send.Sequence_No, 
           v_sub_seq_no, 
           USER_ON_HOLIDAY.User_code, 
           Sysdate, 
           'N', 
           'N', 
           Send.App_Type, 
           Send.user_id); 
          EXCEPTION 
           WHEN OTHERS THEN 
           ROLLBACK; 
           v_errmsg := 'Unable to insert into aph_comp_leveldetails as previous level step not completed'; 
           RETURN; 
          END; 
    ------------------------------------------------------------------------------------------------- 
          BEGIN 
           -- check if user is alreadily part of workflow. 
           SELECT COUNT(*) 
           INTO v_isPresent 
           FROM aph_wf_user 
           WHERE ASSESSMENTID = P_ASSESSMENTID 
           and USER_ID = USER_ON_HOLIDAY.USER_CODE 
           and is_wf_user = 'Y'; 
          END; 
    ------------------------------------------------------------------------------------------------- 
          IF v_isPresent = 0 THEN 
           -- if user is not alreadily part of workflow then insert into aph_wf_user. 
           BEGIN 
           -- insert in aph_wf_user 
           INSERT INTO aph_wf_user 
            (WF_ID, 
            ASSESSMENTID, 
            USER_ID, 
            SEQUENCE_NO, 
            APP_TYPE, 
            IS_EDITABLE, 
            USER_DP, 
            UNIT_TYPE, 
            CREATED_BY, 
            CREATION_DATE) 
           VALUES 
            (V_NewWfId, 
            P_ASSESSMENTID, 
            USER_ON_HOLIDAY.user_code, 
            Send.Sequence_No, 
            send.app_type, 
            'N', 
            v_userDP, 
            send.unit_type, 
            P_USERCODE, 
            sysdate); 
           EXCEPTION 
           WHEN OTHERS THEN 
            ROLLBACK; 
            v_errmsg := 'Unable to insert into aph_comp_leveldetails as previous level step not completed'; 
            RETURN; 
           END; 
          END IF; -- end of if v_isPresent = 0 
    ------------------------------------------------------------------------------------------------- 
          BEGIN 
           --mst_tat_calc 
           INSERT INTO mst_tat_calc 
           (ASSESSMENTID, 
           LEVELID, 
           COMPANY_CODE, 
           USER_CODE, 
           REASON, 
           CASE_START_TIME, 
           CASE_END_TIME, 
           RULE_START_TIME, 
           RULE_END_TIME, 
           CAM_NUMBER, 
           REVIEW_TYPE, 
           UNIT_TYPE, 
           REGION_CODE, 
           LEVELID_COURIER_TO) 
           VALUES 
           (P_ASSESSMENTID, 
           /*p_prevLevelId,*/ 
           V_NEWLEVELID, 
           P_COMPANYCODE, 
           /*p_userCode,*/ 
           USER_ON_HOLIDAY.user_code, 
           'C',--This should be value of enum CommonActionEnum.COURIER 
           sysdate, 
           null, 
           sysdate, 
           null, 
           p_camNumber, 
           p_reviewType, 
           p_unitType, 
           P_REGIONCODE, 
           /*V_Newlevelid*/ 
           p_prevLevelId 
           ); 
    ------------------------------------------------------------------------------------------------- 
           INSERT INTO mst_tat_calc 
           (ASSESSMENTID, 
           LEVELID, 
           COMPANY_CODE, 
           USER_CODE, 
           REASON, 
           CASE_START_TIME, 
           RULE_START_TIME, 
           CAM_NUMBER, 
           REVIEW_TYPE, 
           UNIT_TYPE, 
           REGION_CODE, 
           DAYS) 
           VALUES 
           (P_ASSESSMENTID, 
           V_NEWLEVELID, 
           p_companyCode, 
           USER_ON_HOLIDAY.user_code, 
           'N',--This should be value of enum CommonActionEnum.NORMAL_APPROVAL 
           sysdate, 
           fn_get_rule_date(sysdate), 
           p_camNumber, 
           p_reviewType, 
           p_unitType, 
           p_regionCode, 
           0); 
          EXCEPTION 
           WHEN OTHERS THEN 
           ROLLBACK; 
           v_errmsg := 'Unable to insert into mst_tat_calc as normal approver'; 
           RETURN; 
          END; 
    ------------------------------------------------------------------------------------------------- 
          -- Check for if user has any courier 
          BEGIN 
           -- update in aph_user_Courier as courier status sent and sent date 
           SELECT COUNT(1) 
           INTO v_courierCount 
           FROM aph_user_courier 
           WHERE assessmentid = p_assessmentid 
           AND touser   = USER_ON_HOLIDAY.User_code 
           AND levelid  = p_prevlevelid; 

           if v_courierCount = 0 then 
           begin 
           Pack_Aph_Getid.Proc_Aph_Getid('APH_USER_COURIER','COURIER_ID', v_NewCourierId); -- generate courier id. 
           end; 

           INSERT 
           INTO APH_USER_COURIER 
            (
            COURIER_ID, 
            ASSESSMENTID, 
            LEVELID, 
            FROMUSER, 
            TOUSER, 
            FROMUSER_COMMENTS, 
            TOUSER_COMMENTS, 
            FROMCOURIER_STATUS, 
            TOCOURIER_STATUS, 
            FROM_DATETIME, 
            TO_DATETIME, 
            DOCUMENTRECEIVED, 
            RECEIVEDDATE 
           ) 
            --values (v_NewCourierId, p_assessmentid, V_Newlevelid, p_usercode, Send.User_Id, null, null, 'SENT' , null , sysdate , null, null, null); 
            VALUES 
            (
            v_NewCourierId, 
            p_assessmentid, 
            V_Newlevelid, 
            p_usercode, 
            USER_ON_HOLIDAY.User_code, 
            v_courierComments, 
            NULL, 
            'SENT' , 
            NULL , 
            sysdate , 
            NULL, 
            NULL, 
            NULL 
           ); 
           else 
           UPDATE aph_user_Courier 
            SET fromcourier_status = 'SENT', 
             tocourier_status = null, 
             FROM_DATETIME  = SYSDATE 
           WHERE assessmentid = p_assessmentid 
            AND levelid = p_prevlevelid 
            --AND touser = Send.User_Id; 
            AND touser = USER_ON_HOLIDAY.User_code 
           end if; 

          EXCEPTION 
           WHEN OTHERS THEN 
           ROLLBACK; 
           v_errmsg := 'Unable to update aph_user_Courier'; 
           RETURN; 
          END;  

       BEGIN 
           SP_COMMON_INSERTS(p_assessmentId, p_prevLevelId, V_Newlevelid, 'N', 'N',0,'0','N', p_errorDetail) 
          EXCEPTION 
           WHEN OTHERS THEN 
           p_Errordetail := 'Error in common'; 
       ROLLBACK; 
          END; 

          BEGIN 
           UPDATE APH_WF_USER set IS_EDITABLE = 'N' where USER_ID = Send.User_Id and ASSESSMENTID = p_assessmentId; 
          END; 
         END; 
END SP_SEND_CASE_NEXT_LEVEL; 

Procedure Sp_Common_Inserts 
(
    --p_wfId In Number, 
    p_assessmentId In Number, 
    p_prevLevelId In Number, 
    p_Newlevelid in number, 
    p_withdraw in varchar2, 
    p_rejected in varchar2, 
    p_prevAssessmentId in Number, 
    p_borrowerCode in varchar2, 
    p_srm_lcr in varchar2, 
    p_errorDetail Out Varchar2 
) Is 

v_wfId Number(8); 
V_Errmsg Varchar2(50); 
v_initiatorUserCode varchar2(50); 
V_SrNo Number(8); 

Begin 
    -- Savepoint Start_Tran1; 

     if p_withdraw = 'N' and p_rejected = 'N' then 
     begin 
     -- APH_ASSESSMENT_PARAMETER 
     INSERT INTO APH_ASSESSMENT_PARAMETER 
     (
     SR_NO, 
     ASSESSMENTID, 
     LEVELID, 
     CAM_DATE, 
     REVISION_DATE, 
     SRM_EXPIRY_DATE, 
     PART_PROGRAM, 
     PRODUCT_PROGRAM, 
     PRODUCT_PROGRM_EXPOSURE, 
     PROGRM_PARAMETERS_ADHERED, 
     IS_SEPARETE_APPROVER, 
     CASH_BACKED_EXPOSURE, 
     EXPOSURE_GURANTED, 
     CLIMS_ID, 
     CAM_LOGIN_DATE, 
     BORROWER_RATING, 
     RATING_TYPE, 
     RATING_FINALISATION_DATE, 
     INITIAL_LABELLING_DATE, 
     CURRENT_REVIEW_DATE, 
     LABEL_REVIEW_TYPE, 
     LABEL, 
     LAST_CLIENT_CALL_DATE, 
     CALLED_ON_DATE, 
     INTERFACE_DATE, 
     COMP_CODE 
    ) SELECT 
     SR_NO, 
     p_assessmentId, 
     p_Newlevelid, 
     CAM_DATE, 
     REVISION_DATE, 
     SRM_EXPIRY_DATE, 
     PART_PROGRAM, 
     PRODUCT_PROGRAM, 
     PRODUCT_PROGRM_EXPOSURE, 
     PROGRM_PARAMETERS_ADHERED, 
     IS_SEPARETE_APPROVER, 
     CASH_BACKED_EXPOSURE, 
     EXPOSURE_GURANTED, 
     CLIMS_ID, 
     CAM_LOGIN_DATE, 
     BORROWER_RATING, 
     RATING_TYPE, 
     RATING_FINALISATION_DATE, 
     INITIAL_LABELLING_DATE, 
     CURRENT_REVIEW_DATE, 
     LABEL_REVIEW_TYPE, 
     LABEL, 
     LAST_CLIENT_CALL_DATE, 
     CALLED_ON_DATE, 
     INTERFACE_DATE, 
     COMP_CODE 
     From APH_ASSESSMENT_PARAMETER 
     Where Levelid = p_prevlevelid; 
     Exception 
     When No_Data_Found Then 
     rollback; 
     v_errmsg := 'Unable to insert into APH_ADDENDUM_DETAILS as no data found at previous level'; 
     return; 
     end; 

     end if; 

     IF P_WITHDRAW = 'Y' or P_REJECTED = 'Y' THEN 
     --APH_APPRAISAL_DETAILS 
     begin 
     INSERT INTO APH_APPRAISAL_DETAILS 
     (
     ASSESSMENTID, 
     COMPANY_CODE, 
     CAM_FORMAT_ID, 
     FILE_NAME, 
     ORDER_ID, 
     REPORTS_HTML_CONTENTS, 
     SR_NO 
    )SELECT 
     p_assessmentId, 
     COMPANY_CODE, 
     CAM_FORMAT_ID, 
     FILE_NAME, 
     ORDER_ID, 
     REPORTS_HTML_CONTENTS, 
     SR_NO 
     FROM APH_APPRAISAL_DETAILS 
     WHERE ASSESSMENTID = P_prevAssessmentId 
     AND FILE_NAME NOT IN (SELECT FILE_NAME FROM APH_FTL_DETAILS WHERE FTL_ID IN(29,30,31)); 
     Exception 
     When No_Data_Found Then 
     rollback; 
     v_errmsg := 'Unable to insert into APH_BORROWER_DETAILS as no data found at previous level'; 
     Return; 
     End; 
     END IF; 

    p_Errordetail:='SUCCESS'; 

    Exception 
     When Others Then 
     Rollback; 
      p_Errordetail :=v_errmsg; 

End Sp_Common_Inserts; 

請讓我知道如何處理異常在上述兩個程序如果嵌套程序sp_common_insert拋出異常。

回答

1

改爲使用RAISE代替使用RETURN。這樣,子塊中遇到的錯誤也會觸發異常,在您的主塊中設置p_Errordetail的值。另一件事是您在SP_SEND_CASE_NEXT_LEVEL過程的主程序塊中沒有EXCEPTION塊。這裏是你的代碼的修改:

PROCEDURE SP_SEND_CASE_NEXT_LEVEL 
    (
    p_wfId IN NUMBER, 
    p_assessmentId  IN NUMBER, 
    p_prevLevelId  IN NUMBER, 
    p_appType   IN NUMBER, 
    p_sequenceNumber IN NUMBER, 
    p_subSequenceNumber IN NUMBER, 
    p_userCode   IN VARCHAR2, 
    p_companyCode  IN VARCHAR2, 
    p_camNumber   IN VARCHAR2, 
    p_reviewType  IN NUMBER, 
    p_unitType   IN NUMBER, 
    p_regionCode  IN NUMBER, 
    p_caseType   IN VARCHAR2, 
    p_isApproved  IN VARCHAR2, 
    p_fromUserCode  IN VARCHAR2, 
    P_ERRORDETAIL  OUT VARCHAR2 
) IS 

    V_Newlevelid   NUMBER(8); 
    V_NewWfId    NUMBER(8); 
    v_StepCompleted  NUMBER(2); 
    v_caseComplete   VARCHAR2(1); 
    v_isStepComplete  VARCHAR2(1); 
    v_isCompanyPicked  VARCHAR2(1); 
    v_subUserInWorkflow NUMBER(1); 
    v_isPresent   NUMBER(1); 
    v_inConsistentWorkFlow VARCHAR2(2); 
    v_subUserCode   VARCHAR2(8); 
    v_errmsg    VARCHAR2(50); 
    v_userDP    NUMBER(10, 2); 
    v_sql     VARCHAR2(2000); 
    v_sub_seq_no   NUMBER(8); 
    v_reversalSequenceNo NUMBER(4); 
    v_reversalAppType  NUMBER(2); 
    v_NewCourierId  NUmber(8); 
    v_courierCount   NUMBER(1); 
    v_revSequenceNo  NUMBER(4); 
    v_courierComments VARCHAR2(4000); 
    v_required_count NUMBER(2); 
    v_sessionPriority NUMBER(1); 
    v_customRequiredCount NUMBER(1); 
    BEGIN 
    p_errorDetail   := 'Failure'; 
    v_inConsistentWorkFlow := 'N'; 
    v_reversalAppType  := 0; 
    v_revSequenceNo   :=0; 
    v_courierComments := ''; 
    v_customRequiredCount := 0; 
    SAVEPOINT Start_Tran; 
    BEGIN 

     -- update aph_comp_leveldetails for initiator of case 
     UPDATE Aph_Comp_Leveldetails 
     SET Case_Complete = 'Y', 
      End_Date   = Sysdate, 
      Is_Step_Complete = 'Y', 
      is_approved  = p_isApproved 
     WHERE User_Code = p_userCode 
     AND Assessmentid = p_assessmentId 
     and levelid = p_prevlevelid; 

     -- update Aph_Comp_Header for case status 
     UPDATE Aph_Comp_Header 
     SET CASE_STATUS_DESC = 'Pending', 
     COMP_REVERSE = 'N'   
     WHERE Assessmentid = p_assessmentId; 

     -- update MST_TAT_CALC set case end time for previous level user 
     UPDATE MST_TAT_CALC 
     SET CASE_END_TIME = sysdate, 
     RULE_END_TIME = sysdate, 
     days = fn_get_days(RULE_START_TIME, sysdate, REASON) 
     WHERE User_Code = p_userCode -- TODO : to be removed 
     and LEVELID = p_prevLevelId 
     AND ASSESSMENTID = p_assessmentId 
     and reason <> 'C' and CASE_END_TIME is null; 
     ------------------------------------------------------------------------------------------------- 
     ------------------------------------------------------------------------------------------------- 

     SELECT COUNT(CASE_COMPLETE) into v_required_count 
     FROM APH_COMP_LEVELDETAILS 
     WHERE ASSESSMENTID = p_assessmentid 
     AND SEQ_NO   = p_sequenceNumber 
     AND APP_TYPE  = p_appType 
     and COMP_REVERSE = 'N' 
     and COMP_WITHDRAWN = 'N' 
     and COMP_REJECTED = 'N'; 

     SELECT COUNT(CASE_COMPLETE) into v_StepCompleted 
     FROM APH_COMP_LEVELDETAILS 
     WHERE ASSESSMENTID = p_assessmentid 
     AND SEQ_NO   = p_sequenceNumber 
     AND APP_TYPE  = p_appType 
     AND CASE_COMPLETE = 'Y' 
     and COMP_REVERSE = 'N' 
     and COMP_WITHDRAWN = 'N' 
     and COMP_REJECTED = 'N'; 



           BEGIN 
           -- aph_comp_leveldetails 
           INSERT INTO aph_comp_leveldetails 
            (WF_ID, 
            ASSESSMENTID, 
            LEVELID, 
            User_Code, 
            Case_Complete, 
            COMP_FROMUSER, 
            SEQ_NO, 
            SUB_SEQ_NO, 
            COMP_TOUSER, 
            Start_Date, 
            IS_STEP_COMPLETE, 
            Is_Company_Picked, 
            App_Type, 
            WORK_FLOW_USER) 
           VALUES 
            (Send.Wf_Id, 
            p_assessmentId, 
            V_Newlevelid, 
            USER_ON_HOLIDAY.User_code, 
            'N', 
            --send.user_id, 
            P_USERCODE, 
            Send.Sequence_No, 
            v_sub_seq_no, 
            USER_ON_HOLIDAY.User_code, 
            Sysdate, 
            'N', 
            'N', 
            Send.App_Type, 
            Send.user_id); 
           EXCEPTION 
           WHEN OTHERS THEN 
            ROLLBACK; 
            v_errmsg := 'Unable to insert into aph_comp_leveldetails as previous level step not completed'; 
            RAISE; 
           END; 
     ------------------------------------------------------------------------------------------------- 
           BEGIN 
           -- check if user is alreadily part of workflow. 
           SELECT COUNT(*) 
            INTO v_isPresent 
            FROM aph_wf_user 
           WHERE ASSESSMENTID = P_ASSESSMENTID 
            and USER_ID = USER_ON_HOLIDAY.USER_CODE 
            and is_wf_user = 'Y'; 
           END; 
     ------------------------------------------------------------------------------------------------- 
           IF v_isPresent = 0 THEN 
           -- if user is not alreadily part of workflow then insert into aph_wf_user. 
           BEGIN 
            -- insert in aph_wf_user 
            INSERT INTO aph_wf_user 
            (WF_ID, 
            ASSESSMENTID, 
            USER_ID, 
            SEQUENCE_NO, 
            APP_TYPE, 
            IS_EDITABLE, 
            USER_DP, 
            UNIT_TYPE, 
            CREATED_BY, 
            CREATION_DATE) 
            VALUES 
            (V_NewWfId, 
            P_ASSESSMENTID, 
            USER_ON_HOLIDAY.user_code, 
            Send.Sequence_No, 
            send.app_type, 
            'N', 
            v_userDP, 
            send.unit_type, 
            P_USERCODE, 
            sysdate); 
           EXCEPTION 
            WHEN OTHERS THEN 
            ROLLBACK; 
            v_errmsg := 'Unable to insert into aph_comp_leveldetails as previous level step not completed'; 
            RAISE; 
           END; 
           END IF; -- end of if v_isPresent = 0 
     ------------------------------------------------------------------------------------------------- 
           BEGIN 
           --mst_tat_calc 
           INSERT INTO mst_tat_calc 
            (ASSESSMENTID, 
            LEVELID, 
            COMPANY_CODE, 
            USER_CODE, 
            REASON, 
            CASE_START_TIME, 
            CASE_END_TIME, 
            RULE_START_TIME, 
            RULE_END_TIME, 
            CAM_NUMBER, 
            REVIEW_TYPE, 
            UNIT_TYPE, 
            REGION_CODE, 
            LEVELID_COURIER_TO) 
           VALUES 
            (P_ASSESSMENTID, 
            /*p_prevLevelId,*/ 
            V_NEWLEVELID, 
            P_COMPANYCODE, 
            /*p_userCode,*/ 
            USER_ON_HOLIDAY.user_code, 
            'C',--This should be value of enum CommonActionEnum.COURIER 
            sysdate, 
            null, 
            sysdate, 
            null, 
            p_camNumber, 
            p_reviewType, 
            p_unitType, 
            P_REGIONCODE, 
            /*V_Newlevelid*/ 
            p_prevLevelId 
            ); 
     ------------------------------------------------------------------------------------------------- 
           INSERT INTO mst_tat_calc 
            (ASSESSMENTID, 
            LEVELID, 
            COMPANY_CODE, 
            USER_CODE, 
            REASON, 
            CASE_START_TIME, 
            RULE_START_TIME, 
            CAM_NUMBER, 
            REVIEW_TYPE, 
            UNIT_TYPE, 
            REGION_CODE, 
            DAYS) 
           VALUES 
            (P_ASSESSMENTID, 
            V_NEWLEVELID, 
            p_companyCode, 
            USER_ON_HOLIDAY.user_code, 
            'N',--This should be value of enum CommonActionEnum.NORMAL_APPROVAL 
            sysdate, 
            fn_get_rule_date(sysdate), 
            p_camNumber, 
            p_reviewType, 
            p_unitType, 
            p_regionCode, 
            0); 
           EXCEPTION 
           WHEN OTHERS THEN 
            ROLLBACK; 
            v_errmsg := 'Unable to insert into mst_tat_calc as normal approver'; 
            RAISE; 
           END; 
     ------------------------------------------------------------------------------------------------- 
           -- Check for if user has any courier 
           BEGIN 
           -- update in aph_user_Courier as courier status sent and sent date 
           SELECT COUNT(1) 
            INTO v_courierCount 
           FROM aph_user_courier 
           WHERE assessmentid = p_assessmentid 
            AND touser   = USER_ON_HOLIDAY.User_code 
            AND levelid  = p_prevlevelid; 

           if v_courierCount = 0 then 
           begin 
            Pack_Aph_Getid.Proc_Aph_Getid('APH_USER_COURIER','COURIER_ID', v_NewCourierId); -- generate courier id. 
           end; 

           INSERT 
            INTO APH_USER_COURIER 
            (
             COURIER_ID, 
             ASSESSMENTID, 
             LEVELID, 
             FROMUSER, 
             TOUSER, 
             FROMUSER_COMMENTS, 
             TOUSER_COMMENTS, 
             FROMCOURIER_STATUS, 
             TOCOURIER_STATUS, 
             FROM_DATETIME, 
             TO_DATETIME, 
             DOCUMENTRECEIVED, 
             RECEIVEDDATE 
            ) 
            --values (v_NewCourierId, p_assessmentid, V_Newlevelid, p_usercode, Send.User_Id, null, null, 'SENT' , null , sysdate , null, null, null); 
            VALUES 
            (
             v_NewCourierId, 
             p_assessmentid, 
             V_Newlevelid, 
             p_usercode, 
             USER_ON_HOLIDAY.User_code, 
             v_courierComments, 
             NULL, 
             'SENT' , 
             NULL , 
             sysdate , 
             NULL, 
             NULL, 
             NULL 
            ); 
           else 
            UPDATE aph_user_Courier 
            SET fromcourier_status = 'SENT', 
              tocourier_status = null, 
             FROM_DATETIME  = SYSDATE 
            WHERE assessmentid = p_assessmentid 
            AND levelid = p_prevlevelid 
            --AND touser = Send.User_Id; 
            AND touser = USER_ON_HOLIDAY.User_code 
           end if; 

           EXCEPTION 
           WHEN OTHERS THEN 
            ROLLBACK; 
            v_errmsg := 'Unable to update aph_user_Courier'; 
            RAISE; 
           END;  

       BEGIN 
           SP_COMMON_INSERTS(p_assessmentId, p_prevLevelId, V_Newlevelid, 'N', 'N',0,'0','N', p_errorDetail) 
           EXCEPTION 
           WHEN OTHERS THEN 
            p_Errordetail := 'Error in common'; 
        ROLLBACK; 
           END; 

           BEGIN 
           UPDATE APH_WF_USER set IS_EDITABLE = 'N' where USER_ID = Send.User_Id and ASSESSMENTID = p_assessmentId; 
           END; 
          END; 
    Exception 
     When Others Then 
      Rollback; 
      p_Errordetail :=v_errmsg; 
    END SP_SEND_CASE_NEXT_LEVEL; 








    Procedure Sp_Common_Inserts 
    (
    --p_wfId In Number, 
    p_assessmentId In Number, 
    p_prevLevelId In Number, 
    p_Newlevelid in number, 
    p_withdraw in varchar2, 
    p_rejected in varchar2, 
    p_prevAssessmentId in Number, 
    p_borrowerCode in varchar2, 
    p_srm_lcr in varchar2, 
    p_errorDetail Out Varchar2 
) Is 

    v_wfId Number(8); 
    V_Errmsg Varchar2(50); 
    v_initiatorUserCode varchar2(50); 
    V_SrNo Number(8); 

    Begin 
     -- Savepoint Start_Tran1; 

     if p_withdraw = 'N' and p_rejected = 'N' then 
     begin 
     -- APH_ASSESSMENT_PARAMETER 
     INSERT INTO APH_ASSESSMENT_PARAMETER 
     (
     SR_NO, 
     ASSESSMENTID, 
     LEVELID, 
     CAM_DATE, 
     REVISION_DATE, 
     SRM_EXPIRY_DATE, 
     PART_PROGRAM, 
     PRODUCT_PROGRAM, 
     PRODUCT_PROGRM_EXPOSURE, 
     PROGRM_PARAMETERS_ADHERED, 
     IS_SEPARETE_APPROVER, 
     CASH_BACKED_EXPOSURE, 
     EXPOSURE_GURANTED, 
     CLIMS_ID, 
     CAM_LOGIN_DATE, 
     BORROWER_RATING, 
     RATING_TYPE, 
     RATING_FINALISATION_DATE, 
     INITIAL_LABELLING_DATE, 
     CURRENT_REVIEW_DATE, 
     LABEL_REVIEW_TYPE, 
     LABEL, 
     LAST_CLIENT_CALL_DATE, 
     CALLED_ON_DATE, 
     INTERFACE_DATE, 
     COMP_CODE 
     ) SELECT 
     SR_NO, 
     p_assessmentId, 
     p_Newlevelid, 
     CAM_DATE, 
     REVISION_DATE, 
     SRM_EXPIRY_DATE, 
     PART_PROGRAM, 
     PRODUCT_PROGRAM, 
     PRODUCT_PROGRM_EXPOSURE, 
     PROGRM_PARAMETERS_ADHERED, 
     IS_SEPARETE_APPROVER, 
     CASH_BACKED_EXPOSURE, 
     EXPOSURE_GURANTED, 
     CLIMS_ID, 
     CAM_LOGIN_DATE, 
     BORROWER_RATING, 
     RATING_TYPE, 
     RATING_FINALISATION_DATE, 
     INITIAL_LABELLING_DATE, 
     CURRENT_REVIEW_DATE, 
     LABEL_REVIEW_TYPE, 
     LABEL, 
     LAST_CLIENT_CALL_DATE, 
     CALLED_ON_DATE, 
     INTERFACE_DATE, 
     COMP_CODE 
     From APH_ASSESSMENT_PARAMETER 
     Where Levelid = p_prevlevelid; 
     Exception 
     When No_Data_Found Then 
     rollback; 
     v_errmsg := 'Unable to insert into APH_ADDENDUM_DETAILS as no data found at previous level'; 
     RAISE; 
     end; 

     end if; 

     IF P_WITHDRAW = 'Y' or P_REJECTED = 'Y' THEN 
     --APH_APPRAISAL_DETAILS 
     begin 
     INSERT INTO APH_APPRAISAL_DETAILS 
     (
     ASSESSMENTID, 
     COMPANY_CODE, 
     CAM_FORMAT_ID, 
     FILE_NAME, 
     ORDER_ID, 
     REPORTS_HTML_CONTENTS, 
     SR_NO 
     )SELECT 
     p_assessmentId, 
     COMPANY_CODE, 
     CAM_FORMAT_ID, 
     FILE_NAME, 
     ORDER_ID, 
     REPORTS_HTML_CONTENTS, 
     SR_NO 
     FROM APH_APPRAISAL_DETAILS 
     WHERE ASSESSMENTID = P_prevAssessmentId 
     AND FILE_NAME NOT IN (SELECT FILE_NAME FROM APH_FTL_DETAILS WHERE FTL_ID IN(29,30,31)); 
     Exception 
     When No_Data_Found Then 
     rollback; 
     v_errmsg := 'Unable to insert into APH_BORROWER_DETAILS as no data found at previous level'; 
     RAISE; 
     End; 
     END IF; 

    p_Errordetail:='SUCCESS'; 

     Exception 
     When Others Then 
      Rollback; 
      p_Errordetail :=v_errmsg; 

    End Sp_Common_Inserts; 
+0

但是,如果我用raise來替換return,那麼流將停止。 – yatinbc

+0

我明白了..把它放回'RETURN'。因爲你只是在異常部分設置p_Errordetail的值,所以爲什麼不直接設置p_Errordetail而不是先將它設置爲v_errmsg。 – Vance

+0

如果我使用raise和return兩個呢?因爲如果有任何異常,我不想執行下一行代碼。 – yatinbc