Я использую 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.
Спасибо за помощь.
Вы выполняете LEFT внешнее соединение из выбранных значений (которые не будут включать значения * удалены) в таблицу mail_recipient_category. Я думаю, вы хотите иметь правильное внешнее соединение, потому что вы хотите забрать те, которые * были * в таблице, но были удалены из: P31_email_list_assignments. –
Джеффри, спасибо за предложение. Я попробовал правое внешнее соединение. Теперь, когда я пытаюсь переместить и элемент справа налево и сохранить его, я получаю ORA-80006: указанная строка больше не существует ошибки в процессе страницы, но строка все еще существует в таблице mail_recipient_category. Спасибо, что посмотрели на это. Phil – user3138025
Не уверен - ORA-08006 может означать, что запрос соответствует строке более одного раза, и он пытается удалить его дважды? Возможно, попробуйте запустить запрос самостоятельно и посмотрите на результаты. –