Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
16.07.2020, 10:57
|
|||
---|---|---|---|
|
|||
Вопрос про EXCEPTION WHEN |
|||
#18+
Здравствуйте, товарищи :) Пишу я функцию CREATE FUNCTION DECLARE BEGIN SELECT /* Can throw "no data found" */ SELECT RETURN EXCEPTION WHEN OTHERS THEN RETURN NULL END При попытке вызвать функцию из view тот ругается, что на 5 строке блока операторов инициируется транзакция. Поскольку никакой транзакции нет, то складывается ощущение, что эта чудесная калька из Oracle, которая EXCEPTION WHEN, подразумевает использование только в транцакционном коде. Т.е. при ее наличии инициируется транзакция, надо оно или не надо. Все так? Заранее спасибо! С уважением ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.07.2020, 11:27
|
|||
---|---|---|---|
|
|||
Вопрос про EXCEPTION WHEN |
|||
#18+
person1534, Добавление EXCEPTION в plpgsql блок равносильно установке точки сохранения(SAVEPOINT) сразу после BEGIN. А при попадание в EXCEPTION автоматически выполняется ROLLBACK TO SAVEPOINT. Точки сохранения реализованы как вложенные транзакции (subtransactions). Так что транзакция всё-таки есть. А покажите как вы получаете ошибку при вызове из view? Мой простой пример ошибки не дает: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.07.2020, 11:40
|
|||
---|---|---|---|
|
|||
Вопрос про EXCEPTION WHEN |
|||
#18+
Здравствуйте, Павел Лузанов CREATE VIEW AS SELECT A, FUNCTION(B,C) AS D FROM MY_BELOVED_TABLE Ничего криминального, как мне кажется. Встречный вопрос, а что, в не-транзакционном коде обработка ошибок не нужна? Мне, как это, ни BEGIN TRANSACTION, ни SAVEPOINT, рождающиеся сами по себе, не нужны. Я больше привык сам управлять транзакциями, как это в нормальных БД происходит, без AUTOCOMMIT :) С уважением ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.07.2020, 11:48
|
|||
---|---|---|---|
|
|||
Вопрос про EXCEPTION WHEN |
|||
#18+
person1534, Сделали как автоматическую защиту. Если попали в EXCEPTION, то можно не сомневаться - любые изменения в основном блоке будут отменены. Но зная такую особенность plpgsql к обработке ошибок нужно подходить более осознанно. Например, деление на 0 наверное можно и без EXCEPTION проверить. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.07.2020, 11:56
|
|||
---|---|---|---|
|
|||
Вопрос про EXCEPTION WHEN |
|||
#18+
Знаете, Павел Лузанов, Я достаточно осознанно пишу код :) Мне наблюдаемое кажется ошибкой уровня бага. Неудачная и кривая попытка воспроизвести бихевиоры Oracle PL/SQL. Тем не менее, спасибо за комментарии. С уважением ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.07.2020, 12:04
|
|||
---|---|---|---|
Вопрос про EXCEPTION WHEN |
|||
#18+
person1534 Поскольку никакой транзакции нет Транзакция есть. Вызова функции вне транзакции не бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.07.2020, 12:24
|
|||
---|---|---|---|
|
|||
Вопрос про EXCEPTION WHEN |
|||
#18+
person1534 Неудачная и кривая попытка воспроизвести бихевиоры Oracle PL/SQL. Как по мне, отличия от Oracle PL/SQL существенные. - Вы не можете явно начинать и/или завершать транзакцию внутри функции (BEGIN TRANSACTION/COMMIT). Если не брать процедуры, то это всегда где-то снаружи в клиентском коде происходит. - Добавление EXCEPTION автоматом добавляет SAVEPOINT в начало блока. - Попадание в EXCEPTION автоматом выполняет ROLLBACK TO SAVEPOINT. Если есть что откатывать - это удобно, если нет - напрасное расходование ресурсов. В PL/SQL это всё не так. Хорошо ли это или плохо? Здесь могут быть разные мнения, ибо у обоих подходов есть достоинства и недостатки. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=53&tablet=1&tid=1994586]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 274ms |
total: | 410ms |
0 / 0 |