2015-02-14 7 views
0

Я использую следующий блок кода для обновления моего сегмента переднего конца. Но когда я компиляция этогоБлок исключений в PLSQL, выходящий из блока

DECLARE 
    p_person_id     NUMBER   := NULL; 
    p_business_group_id   NUMBER; 
    p_id_flex_num     NUMBER; 
------------------ 
    p_analysis_criteria_id  NUMBER   := NULL; 
    p_person_analysis_id   NUMBER   := NULL; 
    p_per_object_version_number NUMBER   := NULL; 
    v_err       VARCHAR2 (1000) := NULL; 
    p_medical_id     VARCHAR2 (100) := NULL; 
BEGIN 
    FOR i IN (SELECT * 
       FROM xx_hr_upload_master_data_new 
       WHERE person_id IS NOT NULL 
       AND business_group_id IS NOT NULL 
       AND medical_id IS NOT NULL) 
    LOOP 
     p_id_flex_num := 50530; 
     BEGIN 
     SELECT sv.segment1, NVL (sit.object_version_number, 1), 
        sit.analysis_criteria_id, MAX (sit.person_analysis_id) 
      INTO p_medical_id, p_per_object_version_number, 
        p_analysis_criteria_id, p_person_analysis_id 
      FROM fnd_id_flex_structures_tl sttl, 
        fnd_id_flex_structures st, 
        per_person_analyses sit, 
        per_analysis_criteria sv 
      WHERE sttl.id_flex_structure_name = 'ISPs Medical Data' 
       AND sttl.LANGUAGE = USERENV ('LANG') 
       AND st.id_flex_code = sttl.id_flex_code 
       AND st.id_flex_num = sttl.id_flex_num 
       AND st.id_flex_num = sit.id_flex_num 
       AND st.id_flex_num = sv.id_flex_num 
       AND sit.analysis_criteria_id = sv.analysis_criteria_id 
       AND sit.person_id = i.person_id 
     --and sv.SEGMENT1 = '4602001140' 
     GROUP BY sv.segment1, 
        NVL (sit.object_version_number, 1), 
        sit.analysis_criteria_id; 
     EXCEPTION 
     WHEN OTHERS 
     THEN 
      p_medical_id := NULL; 
      p_per_object_version_number := 1; 
      p_person_analysis_id := NULL; 
      p_analysis_criteria_id := NULL; 
      p_person_analysis_id := NULL; 
      p_per_object_version_number := NULL; 
      p_person_id := NULL; 
     END; 
     BEGIN 
------------------------------------------------ 
     IF (p_medical_id IS NULL AND p_analysis_criteria_id IS NULL) 
     THEN 
      -- create a new record in the SIT (Special Information Type)table . 
      p_person_id := i.person_id; 
      p_medical_id := TO_CHAR (i.medical_id); 
----------------------------- 
      hr_sit_api.create_sit 
        (p_validate      => FALSE, 
        p_person_id      => p_person_id, 
        p_business_group_id    => i.business_group_id, 
        p_id_flex_num     => p_id_flex_num, 
        p_effective_date     => TRUNC (SYSDATE), 
        p_date_from      => TRUNC (SYSDATE), 
        p_segment1      => p_medical_id, 
        p_analysis_criteria_id   => p_analysis_criteria_id, 
        p_person_analysis_id    => p_person_analysis_id, 
        p_pea_object_version_number  => p_per_object_version_number 
       ); 
     ELSE 
      -- employee has previous Billing_Acc_Num then update that number in the SIT table . 
      hr_sit_api.update_sit 
       (p_validate      => FALSE, 
        p_person_analysis_id    => p_person_analysis_id, 
        p_pea_object_version_number  => p_per_object_version_number, 
        p_date_from      => TRUNC (SYSDATE), 
        p_segment1      => p_medical_id, 
        p_analysis_criteria_id   => p_analysis_criteria_id 
       ); 
     END IF; 
     UPDATE xx_hr_upload_master_data_new xx 
      SET xx.error_msg = 'Done', 
       xx.emp_data = 'Done' 
      WHERE xx.business_group_id = i.business_group_id 
      AND xx.employee_number = i.employee_number; 
     EXCEPTION 
     WHEN OTHERS 
     THEN 
      p_analysis_criteria_id := NULL; 
      p_person_analysis_id := NULL; 
      p_per_object_version_number := NULL; 
      p_person_id := NULL; 
      p_medical_id := NULL; 
      v_err := NULL; 
      v_err := SQLERRM; 
      UPDATE xx_hr_upload_master_data_new xx 
       SET xx.error_msg = v_err 
      WHERE xx.business_group_id = i.business_group_id 
       AND xx.employee_number = i.employee_number; 
     END; 
    END LOOP; 
    COMMIT; 
END; 

Теперь, когда выбор запрос ничего не выборки, блок исключения вводится где все переменные инициируется к нулю.

Я хочу, чтобы после этого началось, когда create api вызывается внутри условия IF (p_medical_id IS NULL AND p_analysis_criteria_id IS NULL) следует ввести. Но этого не происходит, и программа выходит из этого блока исключений после ввода блока исключений.

+0

Я не вижу никакой причины, по которой эта программа должна вести себя, когда вы сообщаете. Я предлагаю добавить несколько вызовов DBMS_OUTPUT.PUT_LINE в разных точках, чтобы выяснить, что такое поток кода. Вы также можете изменить первый обработчик исключений на 'WHEN NO_DATA_FOUND' вместо' WHEN OTHERS', если на самом деле вы пытаетесь поймать условие, когда SELECT ничего не находит. –

+0

Я добавил DBMS_OUTPUT.PUT_LINE в блок исключений. все еще его впадает в ошибку –

+0

@LalitKumarB - комментарий, такой как ваш без объяснения причин, не помогает. Пожалуйста, подумайте об этом. Благодарю. –

ответ

0

Подсказка может быть: Первый выбор не будет вызывать никаких исключений, если он не получит никакого результата. Если он не получит результата, то для цикла просто не будет введено, поэтому единственное, что произойдет, это фиксация. (Выбор внутри цикла for приведет к возникновению исключения, если он получает 0 строк или более 1 строки. Причина: «select ... to ...»: при использовании «в» выбор должен возвращать точную 1 строку .)

Смежные вопросы