powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Проблема с формой, построенной на VIEW с Instead of триггером
25 сообщений из 33, страница 1 из 2
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930680
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может, кто-нибудь сталкивался, не могу решить проблему.
Есть форма, построенная на view, у которого есть Instead of триггер.
Есть процесс Automatic Row Processing (DML) на Insert, Update, Delete.
Наличие Instead of триггера не позволяет заполнить Return Key Into Item в процессе,
т.к. возникнет ORA-22816: с фразой RETURNING это средство не поддерживается.
Но хочется, чтобы после Insert отработал процесс Automated Row Fetch, а
ему нужен заполненный Primary Key. Казалось бы - не проблема.
Перед Automatic Row Processing создаем еще один процесс, который заполняет
поле с первичным ключом из sequence. Все прекрасно работает, если только
в instead of триггере не случается ошибка.
Если ошибка случается, поле, которое было заполнено из seq не обнуляется.
И после того, как пользователь что-то исправит и снова пошлет submit, на
сервер пойдет уже Update, а не Insert. Со всеми вытекающими...
Помогайте, люди...
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930700
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr_Frost,

Как костыль. Делать
Код: plsql
1.
select max(id) into :ITEM


Или в инстед оф тригере.
Или в том же новом процессе брать currval от сиквенса.
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930727
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly,

Разве что, как костыль, который время от времени будет возвращать неверные данные, а если приложение под нагрузкой, то и того хуже

Mr_Frost,

Вьюшка обновляемая, сама по себе, если убрать триггер INSTEAD OF ?
Какую задачу в данном случае решает триггер INSTEAD OF ? (авось найдется простой альтернативный workaround)
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930732
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr_FrostНо хочется, чтобы после Insert отработал процесс Automated Row Fetch, а
ему нужен заполненный Primary Key
в его св-вах нужно указать
*Primary Key Column т.е. название колонки
??
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930749
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly,

Хотя, решение с currval это выход, только не select max
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930765
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще вариант создать процесс который будет выполняться самым первым при загрузке страницы. В нем чистить ИД и поставить условие что только при ошибке. Вот только не помню можно ли там код ошибки проверять, чтобы не чистил при всех подряд.
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930779
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDev, вью большое, много полей, соединены много таблиц.
Хотелось убить несколько зайцев - использовать это вью во всех
запросах, отчетах, на других страницах, чтобы каждый раз не писать
заново соединения этих таблиц. Только из-за этого.
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930788
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GustlyЕсть еще вариант создать процесс который будет выполняться самым первым при загрузке страницы. В нем чистить ИД и поставить условие что только при ошибке. Вот только не помню можно ли там код ошибки проверять, чтобы не чистил при всех подряд.
Хорошая идея, только что при обсуждении с коллегами к ней пришли.
Сначала хотели в Instead of триггере написать
Exception
when others then
set_value ('item', null); -- за синтаксис не поручусь, сейчас сразу точно не вспомню,
как обнулить поле, но примерно так.
Потом вовремя сообразили, что это не спасет, если будет нарушено условие уникальности на таблицу и т.д.
В итоге развили дальше, видимо нужно использовать на странице свою ф-цию обработки ошибок (Error Handling Function)
где проанализировать ошибку и обнулить ID в случае чего.

Спасибо всем откликнувшимся!)
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930799
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr_Frost,
не понял, почему DML не работает по имени колонки вьюхи?
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930827
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr_Frost,

Или через currval как предложил Gustly.

генерировать в ID ключ из sequence в триггере, после Automated Row Fetch сделать процесс и писать из currval в :ITEM.
Если произойдет ошибка, второй процесс не выполнится.

P.S. Вообще, есть такая фича: при срабатывании ошибок (Validations) apex делает повторную отрисовку, при этом before header процессы повторно не выполняются (и не должны).
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930836
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь не валидации. Здесь падает при process row и на сколько помню эти процессы сработают. Хотя надо проверить. У задачи много решений на самом деле. Самое легкое - вариант с currval.
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930893
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevGustly,

Хотя, решение с currval это выход, только не select max

А есть уверенность, что CURRVAL будет запрашиваться всегда в той же сессии, что NEXTVAL?
Если NEXTVAL запрашивает триггер, а CURRVAL - APEX, то не факт...
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930933
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,
+1
одинаково, что MAX что CUR
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930940
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123одинаково, что MAX что CUR
Не одинаково! :)
MAX - худшее из всех возможных решений для получения уникального значения :)
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930952
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльPetro123одинаково, что MAX что CUR
Не одинаково! :)
MAX - худшее из всех возможных решений для получения уникального значения :)
разные процессы _во времени_ для получения cur сиквенса тоже Г
))
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930958
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
либо ТС делает изврат, либо бага APEX, либо не знает документацию
imho
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930972
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльSvDevGustly,

Хотя, решение с currval это выход, только не select max

А есть уверенность, что CURRVAL будет запрашиваться всегда в той же сессии, что NEXTVAL?
Если NEXTVAL запрашивает триггер, а CURRVAL - APEX, то не факт...
Я думал раз сессия oracle-то одна, значит не должно быть проблем:

http://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns002.htm#SQLRF51138 Before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL. Refer to CREATE SEQUENCE for information on sequences.

т.е. ожидал увидеть ORA-08002, если вызвать NEXTVAL без CURRVAL
Хотя, если подумать)))

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
  :i := 0;
  :i := MY_SEQ.Nextval;
  :i := MY_SEQ.Currval;
  
  dbms_session.modify_package_state(dbms_session.reinitialize);

  :i := MY_SEQ.Currval;
end;



Получаем i = 1373

Очистить бы эти Currval как-нибудь, в Security Attributes / Cleanup PL/SQL Code, вопрос как :)
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930980
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльSvDevGustly,

Хотя, решение с currval это выход, только не select max

А есть уверенность, что CURRVAL будет запрашиваться всегда в той же сессии, что NEXTVAL?
Если NEXTVAL запрашивает триггер, а CURRVAL - APEX, то не факт...
Хотя вру, сессия одна, всегда вызывается Nextval, потом Currval, значит есть уверенность
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38930998
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123разные процессы _во времени_ для получения cur сиквенса тоже Г
))

А тут уже дело не во времени - оракл не даст CURRVAL, если до этого в той же сессии не был вызван NEXTVAL.
Получишь ora-08002
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38931013
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,
Не знал я). Спс.
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38931043
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С апексом все не так очевидно,

В общем, фишка в том, что если оба процесса поместить в Page Processing будет всегда одна oracle-сессия
(одна для Page Rendering и одна для Page Processing) для каждого запроса,

Даже если в апексе ora-08002 не будет (я не проверял в апексе, но считаю её не будет, ввиду теста выше), я считаю, результат гарантирован.
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38931257
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Коллега!
Но мне кажется, что Вы правы в главном - где-то ошибка концептуальная.
И ее можно разрулить проще и без риска нарваться на ошибку под нагрузкой (например).
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38931281
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

У меня у самого руки чешутся использовать instead of для чего-то подобного. Решений-то много всяких, но в них острые углы.
Например, есть такой механизм в апексе, как оптимистическая блокировка, ее реализуют стандартные процессы типа Automatic Row Processing. А формы на страницах бывают сложными, из нескольких таблиц. Хочется сохранить оптимистическую блокировку, но тогда нужно использовать стандартные процессы, чтобы не делать её самому (это трудоемко). Соответственно создаётся view и если view не обновляемое, возникает ошибка... Так что проблема достаточно актуальная.

Из предложений error handling function и currval, это на вкус, конечно, но мне с currval больше нравится. Концептуально вроде достаточно прилично, другое дело, от багов типа ora-600 никто не застрахован.
С нагрузкой я здесь не вижу проблем, если делать все в точности.

P.S. поправочка к тесту, забыл вынести в отдельный анонимный блок, результат тот же

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
 Присоединен к:
 Oracle Database 11g Enterprise Edition Release 
11.2.0.3.0 - 64bit Production  With the Partitioning, 
Oracle Label Security, OLAP, Data Mining 
and Real Application Testing options

SQL> set serveroutput on                
SQL> create sequence test1234;      

Последовательность создана                    
         
SQL> declare  l_id number;      
  2  begin                        
  3    l_id := test1234.nextval;      
  4    l_id := test1234.currval;                                              
  5    dbms_output.put_line(l_id);          
  6  end;           
  7  /                                                                        
1              

Процедура PL/SQL успешно завершена.   

SQL> begin             
  2  dbms_session.modify_package_state(dbms_session.reinitialize);
  3  end;      
  4  /                   

Процедура PL/SQL успешно завершена.    

SQL> set serveroutput on    
SQL> declare                            
  2    l_id number;                                                           
  3  begin                                                                   
  4    l_id := test1234.currval;                                             
  5    dbms_output.put_line(l_id);                                            
  6  end;                                                                    
  7  /                                                                        
1    

Процедура PL/SQL успешно завершена.          

SQL> disconnect                                         
                
Отсоединено от Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
 - 64b Production     
With the Partitioning, Oracle Label Security, OLAP, Data Mining 
and Real Application Testing options          
                                
SQL> connect login                          

Введите пароль:              
Соединено.               
                                                     
SQL>                                                             
SQL> declare                                                                 
   2    l_id number;                                                          
   3  begin                                                                   
   4    l_id := test1234.currval;                                             
   5  end;                                                                    
   6  /                                                                 

      declare                                                                       
*                                                                             
ошибка в строке 1:                                                            
ORA-08002: последов. TEST1234.CURRVAL еще не определен в этом сеансе          
ORA-06512: на  line 4       
                                                                                                                                                          
SQL> drop sequence test1234;             
       
Последовательность удалена.         
                                          


(Тест показывает, что очистка между запросами как следует не происходит, но я уже написал выше по этому поводу)
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38931319
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDevУ меня у самого руки чешутся использовать instead of для чего-то подобного. Решений-то много всяких, но в них острые углы.
Например, есть такой механизм в апексе, как оптимистическая блокировка, ее реализуют стандартные процессы типа Automatic Row Processing. А формы на страницах бывают сложными, из нескольких таблиц. Хочется сохранить оптимистическую блокировку, но тогда нужно использовать стандартные процессы, чтобы не делать её самому (это трудоемко). Соответственно создаётся view и если view не обновляемое, возникает ошибка...
SvDev, а вот с блокировкой как раз проблем не возникает, для блокировки Apex использует поля view. Если у региона указать идентификатор первичный ключ, а не rowid - проблем не будет. Кроме одной. У Apex'а есть баг. Несмотря на то, что ему сказано идентифицировать строки по первичному ключу, для Validations он использует rowid, а т.к. rowid из такого вью не извлечь - возникает ошибка. Приходится удалять Validations - тогда все прекрасно работает.
...
Рейтинг: 0 / 0
Проблема с формой, построенной на VIEW с Instead of триггером
    #38931321
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDevИз предложений error handling function и currval, это на вкус, конечно, но мне с currval больше нравится
Мне уже тоже)
С error handling function есть проблема - как в функции отличать Insert от U или D? Обнулять id нужно только при неудавшемся Insert.
В общем, еду на работу, и пробую currval, если поможет - отпишусь.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Проблема с формой, построенной на VIEW с Instead of триггером
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]