2014-11-19 4 views
1

저는 Apex 4.2.4와 Oracle 11g를 사용하고 있습니다. 여러 개의 메일 링리스트를 관리하는 메일 링리스트 애플리케이션이 있습니다. 주어진 수신자는 하나 이상의 목록에 속할 수 있습니다. 목록을 관리하기 위해 Apex Shuttle을 사용하고 있습니다. 모든 메일 수신자의 출처는 mail_recipient 테이블에 있습니다.oracle apex shuttle saving deselections

  • prim_key
  • FIRST_NAME 주어진 메일 링리스트에 대한 선택받는 사람을 저장하는 다른 테이블이 있습니다

  • LAST_NAME
  • EMAIL_ADDRESS : mail_recipient_category mail_recipient 네 개의 중요한 분야가 있습니다 : mail_recipient_category의 중요한 필드는 다음과 같습니다.

    • prim_key
    • recipient_fkey (이것은 mail_recipient 테이블에서 prim_key 저장)
    • 카테고리
    • merge_check

    두있다 페이지에 표시된 항목을 표시. 범주 드롭 다운리스트 (P31_email_list) 및 셔틀 (P31_email_list_assignments)는 P31_email_list_assignments 대한 LOV은 :

    Select last_name || ', ' || first_name || ' -- ' || email_address, prim_key from mail_recipient 
    order by 1; 
    

    셔틀의 소스 PL/SQL 함수 체이다

    declare 
        emp_list apex_application_global.vc_arr2; 
        i     number := 1; 
    begin 
        for r in (Select mr.last_name || ', ' || mr.first_name || ' -- ' || mr.email_address, mr.prim_key 
          From mail_recipient mr left outer join 
           mail_recipient_category mrc 
          On mr.prim_key = mrc.recipient_fkey 
          Where mrc.category = :P31_EMAIL_LIST) 
        loop 
        emp_list(i) := r.prim_key; 
        i := i + 1; 
        end loop; 
        return APEX_UTIL.TABLE_TO_STRING(emp_list, ':'); 
    end; 
    

    가있다 단일 페이지 프로세스가 데이터베이스 테이블 mail_recipient_category를 업데이트합니다. 프로세스는 계산 및 검증 후에 제출할 때 실행됩니다. 셔틀은 왼쪽에서 오른쪽으로로드하고 항목을 저장 잘 작동

    MERGE INTO MAIL_RECIPIENT_CATEGORY ss 
    USING (
        Select 
         shuttle.column_value shuttle_st 
         , db.recipient_fkey db_st 
        from 
         table(string_to_coll(:P31_email_list_assignments)) shuttle 
          left outer join mail_recipient_category db 
          on shuttle.column_value = db.recipient_fkey 
          and db.category = :P31_email_list) t 
    on (ss.recipient_fkey = t.db_st 
    and ss.category = :P31_email_list  
        ) 
    when matched 
    then 
        update 
        set 
         ss.merge_check = ss.merge_check 
        delete 
        where 
         t.shuttle_st is null and ss.category = :P31_email_list 
    --  t.shuttle_st is null 
    
        when not matched 
        then 
        insert 
         (recipient_fkey, category) 
        values 
         (t.shuttle_st, :P31_email_list); 
    end; 
    

    시작 . 내가 가지고있는 문제는 셔틀의 오른쪽에서 왼쪽으로 항목을 선택 해제하는 것입니다. 메일 수신자를 오른쪽에서 왼쪽으로 이동 한 후 전송 버튼을 누르면 항목이 셔틀의 오른쪽을 떠나지 않고 프로세스가 mail_recipient_category 테이블에서 행을 삭제하지 않습니다.
    감사합니다.

  • +0

    mail_recipient_category 테이블에 선택된 값 (제거 된 * 값은 포함하지 않음)에서 LEFT 외부 조인을 수행하고 있습니다. 오른쪽 외부 조인을 원한다고 생각합니다. 테이블에서 * 삭제되었지만 P31_email_list_assignments에서 제거 된 테이블을 선택하려고하기 때문입니다. –

    +0

    제프리, 제안 해 주셔서 감사합니다. 나는 오른쪽 외부 조인을 시도했다. 이제 오른쪽에서 왼쪽으로 항목을 이동하여 저장하려고하면 ORA-80006이 표시됩니다. 지정된 행은 페이지 프로세스에서 더 이상 존재하지 않지만 아직 행은 mail_recipient_category 테이블에 계속 존재합니다. 이것 좀 봐 줘서 고마워. Phil – user3138025

    +0

    확실하지 않은 경우 - ORA-08006은 쿼리가 두 번 이상 행과 일치하고 두 번 삭제하려고한다는 것을 의미 할 수 있습니다. 아마도 자체적으로 쿼리를 실행하고 결과를 살펴보십시오. –

    답변

    2

    매우 숙련 된 동료와 협력 한 결과 페이지 프로세스가 잘못되었다고 판단했습니다. 특히 병합 문의 Delete 절이이 셔틀에서 작동하지 않는 것 같습니다. 우리는 페이지 프로세스의 병합 문 다음에 별도의 Delete 문을 추가했습니다.
    또한 mail_recipient_category 테이블을 삭제했으며보다 의미있는 이름 인 mail_recipient_list를 사용 중입니다. 셔틀 필드 이름은 (p31_email_list_assignments)입니다.

    작업 셔틀 LOV 정의 코드는 다음과 같습니다

    Select last_name || ', ' || first_name || ' -- ' || email_address, prim_key 
    From mail_recipient 
    order by 1; 
    

    작업 셔틀 소스 코드는 다음과 같습니다

    declare 
        mail_list apex_application_global.vc_arr2; 
        i     number := 1; 
    begin 
        for r in (Select mr.last_name || ', ' || mr.first_name || ' -- ' || mr.email_address, mr.prim_key 
          From mail_recipient mr left join 
           mail_recipient_list mrl 
          On mr.prim_key = mrl.recipient_fkey 
          Where mrl.list = :P31_EMAIL_LIST) 
        loop 
        mail_list(i) := r.prim_key; 
        i := i + 1; 
        end loop; 
        return APEX_UTIL.TABLE_TO_STRING(mail_list, ':'); 
    end; 
    

    근로 후 제출 페이지 프로세스 코드는 다음과 같습니다

    Begin 
    Merge Into MAIL_RECIPIENT_LIST mrl 
    Using (
        Select 
         shuttle.column_value shuttle_cv 
         , db.recipient_fkey db_rfk 
        From 
         table(string_to_coll(:P31_email_list_assignments)) shuttle 
          left outer join mail_recipient_list db 
          on shuttle.column_value = db.recipient_fkey 
          and db.list = :P31_email_list) t 
    On (mrl.recipient_fkey = t.db_rfk 
    And mrl.list = :p31_email_list  
        ) 
    When Matched 
    Then 
        Update 
        Set 
         mrl.merge_check = mrl.merge_check 
    -- Delete 
    --  Where 
    --  t.shuttle_cv is null 
    
    When Not Matched 
        Then 
        Insert 
         (recipient_fkey, list) 
        Values 
         (t.shuttle_cv, :P31_email_list); 
    
    /* The commented-out delete clause of the Merge statement never worked with this shuttle. 
        The following delete statement will every time this page process is called 
    */ 
    Delete from MAIL_RECIPIENT_LIST 
    Where instr(':' || :P31_email_list_assignments || ':',':' || recipient_fkey || ':') = 0 
    And list = :P31_email_list; 
    end; 
    

    I 누군가가 유용하다고 생각하기를 바랍니다.