2013-03-20 2 views
1

다음 함수는 실패합니다. 다음 함수는 정상적으로 컴파일됩니다. 그러나 익명 PL/SQL 코드에서 함수를 호출하면 호출이 실패합니다. 누구나 제안 할 수 있습니까? 일치하지 않는 (새) 데이터를 삽입하고 일치하는 데이터 (기존)를 업데이트하려고합니다.ORA-00904 : "TEMP_DATA". "P_LNAME": 유효하지 않은 식별자

Function Fn_Insert_Data_Using_Merge (p_Id in Number, 
            p_fname in varchar2, 
            p_mname in varchar2, 
            p_lname in varchar2, 
            p_birth_date in date) Return Boolean 
Is 
Begin 
    Dbms_Output.put_line ('Inside the function Fn_Insert_Data_Using_Merge ...'); 
    Merge Into test_employee te 
    using (select distinct p_Id, p_fname, p_mname, p_lname, p_birth_date 
      from test_employee) temp_data 
    on (te.first_name = temp_data.p_fname and 
     te.middle_name = temp_data.p_mname and 
     te.last_name = temp_data.p_lname) 
    when matched then 
     update 
     set first_name = p_fname, 
      middle_name = p_mname, 
      last_name = p_lname, 
      run_status = 'Updated' 
    when not matched then 
     insert (id, first_name, middle_name, last_name, birth_date, run_status) 
     values 
      (p_id, p_fname, p_mname, p_lname, p_birth_date, 'Inserted'); 

    Dbms_Output.put_line ('Returning successfully from the function Fn_Insert_Data_Using_Merge ...'); 
    Return True; 
Exception 
    When Dup_Val_On_Index Then 
    Dbms_Output.put_line ('The name already exists...Cannot insert again ..'); 
    Return False; 
    When Others Then 
    Dbms_Output.put_line ('Facing some critical error : ' || SQLERRM); 
    Return False; 
End Fn_Insert_Data_Using_Merge; 
+0

오류의 줄 번호는 무엇입니까? – Rachcha

+0

(te.first_name = temp_data.p_fname 및 te.middle_name = temp_data.p_mname 및 te.last_name = temp_data.p_lname) –

+0

ORA-06512 : "FC113EXT.PKG_TEST"줄 101에 ORA-00904 : "TEMP_DATA". " P_LNAME ": 유효하지 않은 식별자 줄 101은"병합으로 test_employee te "문입니다. –

답변

0

오류는 TEMP_DATA 추출에 P_LNAME이라는 열이 없음을 알려줍니다. 'p_lname'이라는 함수에 대한 매개 변수가 있지만 extract에는 추출 된 열 별칭이 없으므로 명명 된 필드가 없습니다. 또한 (오류의 원인은 아니지만) 잠재적으로 많은 행이있는 테이블에서 DISTINCT를 수행하는 것은 USING 절의 임시 테이블에 함수 매개 변수를 가져 오는 느린 방법입니다. SELECT ... FROM DUAL을 사용하는 것이 더 낫습니다. MERGE 성명을 다음 내용으로 변경하고 Google에 알리는 방법을 알려주세요.

공유하고 즐기십시오.

+0

감사합니다. Bob. 코드는 한 번만 변경 한 후에 잘 실행됩니다. 내가 당신의 업데이트 된 코드를 사용했을 때 "예외적으로 언급 된 열을 업데이트 할 수 없다"는 예외가 발생했습니다. 이러한 열을 제거하면 코드가 예상되는 기능대로 작동합니다. –

관련 문제