2014-11-19 4 views
1

Я использую Apex 4.2.4 и Oracle 11g. У меня есть приложение списка рассылки, где я поддерживаю несколько списков рассылки. Данный получатель может принадлежать одному или нескольким спискам. Я использую Apex Shuttle для поддержки списков. Источник всех получателей рассылки находится в таблице: mail_recipient. Есть четыре важных поля в mail_recipient:oracle apex shuttle save deselections

  • prim_key
  • first_name
  • last_name
  • email_address

Существует еще одна таблица, которая хранит выбранных получателей для данного списка рассылки: mail_recipient_category: Важными полями в mail_recipient_category являются:

  • prim_key
  • recipient_fkey (это сохраняет prim_key из таблицы mail_recipient)
  • категории
  • merge_check

Есть два отображения элементов на странице. Категория выпадающий список (P31_email_list) и трансфер (P31_email_list_assignments) LOV для P31_email_list_assignments является:

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

/SQL тело функции PL для источника челнока:

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. Процесс выполняется для отправки после вычислений и валидаций. Begin

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

Вы выполняете LEFT внешнее соединение из выбранных значений (которые не будут включать значения * удалены) в таблицу mail_recipient_category. Я думаю, вы хотите иметь правильное внешнее соединение, потому что вы хотите забрать те, которые * были * в таблице, но были удалены из: P31_email_list_assignments. –

+0

Джеффри, спасибо за предложение. Я попробовал правое внешнее соединение. Теперь, когда я пытаюсь переместить и элемент справа налево и сохранить его, я получаю ORA-80006: указанная строка больше не существует ошибки в процессе страницы, но строка все еще существует в таблице mail_recipient_category. Спасибо, что посмотрели на это. Phil – user3138025

+0

Не уверен - ORA-08006 может означать, что запрос соответствует строке более одного раза, и он пытается удалить его дважды? Возможно, попробуйте запустить запрос самостоятельно и посмотрите на результаты. –

ответ

2

После работы с опытным коллегой мы определили, что процесс страницы был виноват. В частности, предложение Delete для оператора Merge, похоже, не работает для этого шаттла. В результате мы добавили отдельный оператор Delete после оператора Merge в процессе страницы.
Я также удалил таблицу 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 надеюсь, что кто-то найдет это полезным.

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