Надеюсь, я в правильном направлении вашего вопроса здесь;)
Ваш запрос может быть выполнен с помощью чего-то вроде:
select a.some_column1, tab2.some_column1, tab2.some_column2, tab2.some_column3
from table_2 tab2
join (select distinct some_column1 from table_1) a
on tab2.column_in_tab1 = a.some_column1
Причина, по которой вы получаете ORA-02014
ошибка из-за автоматически сгенерированного ApplyMRU
процесса.Этот процесс попытается заблокировать измененную строку (строки):
begin
for r in (select ...
from vw_awkward_view
where <your first defined PK column>= 'value for PK1'
for update nowait)
loop
null;
end loop;
end;
Это облом и означает, что вы не сможете использовать сгенерированный процесс. Вам придется написать собственный процесс, который выполняет обновление .
Для этого вам придется использовать массивы F ## в apex_application .Если это звучит совершенно незнакомо, взгляните на: Пользовательский процесс отправки и при использовании массивов apex_application .
Кроме того, вот какдля апекса с 2004 года от самого Oracle.Он по-прежнему использует много ссылок htmldb, но суть его в этом.
(было бы неплохо использовать интерфейс apex_item
для создания вашей формы и иметь контроль над тем, что генерируется икакой массив он принимает.)
То, что сводится к следующему: переберите массив, содержащий ваши элементы, и сделайте UPDATE
ваше представление с представленными значениями.
Конечно, вынет блокировки таким образом, ни способ предотвратить ненужные обновления. Блокировку вы можете сделать самостоятельно , например, с помощью метода select for update
.Вам придется заблокировать правильные строки в таблицах, которые вы хотите изменить, прежде чем обновлять их.Если блокировка не удалась, ваш процесс должен завершиться неудачей.
Что касается истории «потерянных обновлений» : здесь вам нужно проверить контрольные суммы MD5.Контрольная сумма генерируется из редактируемых столбцов в вашей форме и помещается в HTML-код.При отправке эта контрольная сумма затем сравнивается с вновь созданной контрольной суммой из тех же столбцов, но со значениями из базы данных на момент отправки.Если контрольные суммы различаются, это означает, что запись изменилась между загрузкой страницы и отправкой страницы.Ваш процесс должен потерпеть неудачу, потому что запись была изменена, и вы не хотите, чтобы они были перезаписаны.(если вы идете по apex_item
пути, то не забудьте включить MD5_CHECKSUM (или MD5_HIDDEN).
Важное замечание: контрольные суммы, генерируемые с использованием apex_item или простостандартная функциональность формы создает строку для хэширования. Как вы можете видеть в apex_item.md5_hidden , контрольные суммы генерируются с помощью DBMS_OBFUSCATION_TOOLKIT.MD5
. Вы можете получить контрольную сумму значений в БД двумя способами: wwv_flow_item.md5 или с использованием dbms_obfuscation
. Однако в документации не упоминается следующее: Обсуждение OTN Apex по контрольным суммам MD5 . Каналы добавляются в сгенерированные контрольные суммы! Не забывайте об этом, иначевзорвать тебе в лицо, и ты будешь думать о том, что, черт возьми, с ним не так.
Пример:
select utl_raw.cast_to_raw(dbms_obfuscation_toolkit.md5(input_string=>
"COLUMN1" ||'|'||
"COLUMN2" ||'|'||
"COLUMN5" ||'|'||
"COLUMN7" ||'|'||
"COLUMN10" ||'|'||
"COLUMN12" ||'|'||
"COLUMN14" ||
'|||||||||||||||||||||||||||||||||||||||||||'
)) md5
from some_table
Чтобы получить контрольную сумму ряда some_table
таблица, где столбцы 1, 2, 5, 7, 10, 12, 14 доступны для редактирования!
В конце концов, вот как это должно быть структурировано:
- цикл по массиву
- генерирует контрольную сумму длятекущее значение редактируемых столбцов из базы данных
- сравните эту контрольную сумму с отправленной контрольной суммой (apex_application.g_fcs, если сгенерировано), если контрольные суммы совпадают, продолжите обновление.Если это не так, сбой процесса здесь.
- заблокируйте правильные записи для обновления.Укажите nowait, и его блокировка не удастся. Сбой процесса
- Обновите представление с использованием отправленных значений.Ваш вместо триггера сработает.Убедитесь, что вы используете правильные значения для своего оператора обновления, так что будет обновляться только эта одна запись
Не совершать промежуточные.Это либо все, либо ничего.
Я почти чувствую, что ушел за борт, и может показаться, что все это немного, но, когда вы знаете подводные камни, на самом деле не так сложно вытащить этот обычай.процесс выключен!Мне было очень интересно играть с ним: p