|
|
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Может, кто-нибудь сталкивался, не могу решить проблему. Есть форма, построенная на 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. Со всеми вытекающими... Помогайте, люди... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 15:45 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Mr_Frost, Как костыль. Делать Код: plsql 1. Или в инстед оф тригере. Или в том же новом процессе брать currval от сиквенса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 15:52 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Gustly, Разве что, как костыль, который время от времени будет возвращать неверные данные, а если приложение под нагрузкой, то и того хуже Mr_Frost, Вьюшка обновляемая, сама по себе, если убрать триггер INSTEAD OF ? Какую задачу в данном случае решает триггер INSTEAD OF ? (авось найдется простой альтернативный workaround) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:04 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Mr_FrostНо хочется, чтобы после Insert отработал процесс Automated Row Fetch, а ему нужен заполненный Primary Key в его св-вах нужно указать *Primary Key Column т.е. название колонки ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:05 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Gustly, Хотя, решение с currval это выход, только не select max ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:11 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Есть еще вариант создать процесс который будет выполняться самым первым при загрузке страницы. В нем чистить ИД и поставить условие что только при ошибке. Вот только не помню можно ли там код ошибки проверять, чтобы не чистил при всех подряд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:16 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
SvDev, вью большое, много полей, соединены много таблиц. Хотелось убить несколько зайцев - использовать это вью во всех запросах, отчетах, на других страницах, чтобы каждый раз не писать заново соединения этих таблиц. Только из-за этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:23 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
GustlyЕсть еще вариант создать процесс который будет выполняться самым первым при загрузке страницы. В нем чистить ИД и поставить условие что только при ошибке. Вот только не помню можно ли там код ошибки проверять, чтобы не чистил при всех подряд. Хорошая идея, только что при обсуждении с коллегами к ней пришли. Сначала хотели в Instead of триггере написать Exception when others then set_value ('item', null); -- за синтаксис не поручусь, сейчас сразу точно не вспомню, как обнулить поле, но примерно так. Потом вовремя сообразили, что это не спасет, если будет нарушено условие уникальности на таблицу и т.д. В итоге развили дальше, видимо нужно использовать на странице свою ф-цию обработки ошибок (Error Handling Function) где проанализировать ошибку и обнулить ID в случае чего. Спасибо всем откликнувшимся!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:28 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Mr_Frost, не понял, почему DML не работает по имени колонки вьюхи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:33 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Mr_Frost, Или через currval как предложил Gustly. генерировать в ID ключ из sequence в триггере, после Automated Row Fetch сделать процесс и писать из currval в :ITEM. Если произойдет ошибка, второй процесс не выполнится. P.S. Вообще, есть такая фича: при срабатывании ошибок (Validations) apex делает повторную отрисовку, при этом before header процессы повторно не выполняются (и не должны). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:49 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Здесь не валидации. Здесь падает при process row и на сколько помню эти процессы сработают. Хотя надо проверить. У задачи много решений на самом деле. Самое легкое - вариант с currval. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 16:53 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
SvDevGustly, Хотя, решение с currval это выход, только не select max А есть уверенность, что CURRVAL будет запрашиваться всегда в той же сессии, что NEXTVAL? Если NEXTVAL запрашивает триггер, а CURRVAL - APEX, то не факт... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 17:16 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Курдль, +1 одинаково, что MAX что CUR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 17:29 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Petro123одинаково, что MAX что CUR Не одинаково! :) MAX - худшее из всех возможных решений для получения уникального значения :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 17:33 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
КурдльPetro123одинаково, что MAX что CUR Не одинаково! :) MAX - худшее из всех возможных решений для получения уникального значения :) разные процессы _во времени_ для получения cur сиквенса тоже Г )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 17:37 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
либо ТС делает изврат, либо бага APEX, либо не знает документацию imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 17:38 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Курдль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. Получаем i = 1373 Очистить бы эти Currval как-нибудь, в Security Attributes / Cleanup PL/SQL Code, вопрос как :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 17:43 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
КурдльSvDevGustly, Хотя, решение с currval это выход, только не select max А есть уверенность, что CURRVAL будет запрашиваться всегда в той же сессии, что NEXTVAL? Если NEXTVAL запрашивает триггер, а CURRVAL - APEX, то не факт... Хотя вру, сессия одна, всегда вызывается Nextval, потом Currval, значит есть уверенность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 17:46 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Petro123разные процессы _во времени_ для получения cur сиквенса тоже Г )) А тут уже дело не во времени - оракл не даст CURRVAL, если до этого в той же сессии не был вызван NEXTVAL. Получишь ora-08002 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 18:02 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Курдль, Не знал я). Спс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 18:11 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
С апексом все не так очевидно, В общем, фишка в том, что если оба процесса поместить в Page Processing будет всегда одна oracle-сессия (одна для Page Rendering и одна для Page Processing) для каждого запроса, Даже если в апексе ora-08002 не будет (я не проверял в апексе, но считаю её не будет, ввиду теста выше), я считаю, результат гарантирован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 18:22 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
SvDev, Коллега! Но мне кажется, что Вы правы в главном - где-то ошибка концептуальная. И ее можно разрулить проще и без риска нарваться на ошибку под нагрузкой (например). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 00:29 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
Курдль, У меня у самого руки чешутся использовать 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. (Тест показывает, что очистка между запросами как следует не происходит, но я уже написал выше по этому поводу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 02:39 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
SvDevУ меня у самого руки чешутся использовать instead of для чего-то подобного. Решений-то много всяких, но в них острые углы. Например, есть такой механизм в апексе, как оптимистическая блокировка, ее реализуют стандартные процессы типа Automatic Row Processing. А формы на страницах бывают сложными, из нескольких таблиц. Хочется сохранить оптимистическую блокировку, но тогда нужно использовать стандартные процессы, чтобы не делать её самому (это трудоемко). Соответственно создаётся view и если view не обновляемое, возникает ошибка... SvDev, а вот с блокировкой как раз проблем не возникает, для блокировки Apex использует поля view. Если у региона указать идентификатор первичный ключ, а не rowid - проблем не будет. Кроме одной. У Apex'а есть баг. Несмотря на то, что ему сказано идентифицировать строки по первичному ключу, для Validations он использует rowid, а т.к. rowid из такого вью не извлечь - возникает ошибка. Приходится удалять Validations - тогда все прекрасно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 06:45 |
|
||
|
Проблема с формой, построенной на VIEW с Instead of триггером
|
|||
|---|---|---|---|
|
#18+
SvDevИз предложений error handling function и currval, это на вкус, конечно, но мне с currval больше нравится Мне уже тоже) С error handling function есть проблема - как в функции отличать Insert от U или D? Обнулять id нужно только при неудавшемся Insert. В общем, еду на работу, и пробую currval, если поможет - отпишусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 06:48 |
|
||
|
|

start [/forum/topic.php?fid=50&msg=38930749&tid=1875004]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 413ms |

| 0 / 0 |
