powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обработка любой ошибки в процедуре
7 сообщений из 7, страница 1 из 1
Обработка любой ошибки в процедуре
    #32774948
Привет всем.

Вопрос такой есть ли в Постгре какойто обработчик любой ошибки (нет реляции, поле нот нулл и т.п.). Тоесть мне надо, чтобы при возникновении ошибки при выполнении запроса в процедуре, я мог обработать ошибку, откатить транзакцию и выйти из процедуры с возвращением из нее нужного мне значения.

Вопрос - можноли сделать так, чтобы при возникновении ошибки процедура не вываливалась с ексептионом "произошла какаято беда", а возвращала например красивое значение -1 .

-----------------------------------------------------------------------
На MSSQL я делал следующим образом:
@@ERROR - системная переменая, которая содержит код ошибки при возникновении какой либо ошибки в вышеописаном запросе.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
BEGIN TRANSACTION 
	INSERT INTO tbTest ( Field )
	VALUES (  1  )

	IF ( @@ERROR !=  0  ) GOTO Label_ExitWithRollback 

COMMIT TRANSACTION

RETURN  1 

----------------------------------------------------------------------	
--> Labels --
Label_ExitWithRollback:
IF ( @@TRANCOUNT >  0  ) ROLLBACK TRANSACTION 

RETURN - 1 
-- Labels <--

Воможно я смотрю на данную тему с привычной мне колокольни, если так то подскажите пути решения.

Всем спасибо
...
Рейтинг: 0 / 0
Обработка любой ошибки в процедуре
    #32775185
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostgreSQL does not have a very smart exception handling model. Whenever the parser, planner/optimizer or executor decide that a statement cannot be processed any longer, the whole transaction gets aborted and the system jumps back into the main loop to get the next command from the client application.

It is possible to hook into the error mechanism to notice that this happens. But currently it is impossible to tell what really caused the abort (data type format error, floating-point error, parse error, etc.). And it is possible that the database server is in an inconsistent state at this point so returning to the upper executor or issuing more commands might corrupt the whole database.

Thus, the only thing PL/pgSQL currently does when it encounters an abort during execution of a function or trigger procedure is to add some fields to the message telling in which function and where (line number and type of statement) the error happened. The error always stops execution of the function.
...
Рейтинг: 0 / 0
Обработка любой ошибки в процедуре
    #32775276
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В версии 8.0 в pl/pgsql добавили возможность перехвата исключений по образцу Oracle:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Chapter  35 . PL/pgSQL - SQL Procedural Language
 35 . 6 . Basic Statements

BEGIN
  y := x /  0 ;
EXCEPTION
  WHEN division_by_zero THEN
     NULL;  -- ignore the error
END;
...
Рейтинг: 0 / 0
Обработка любой ошибки в процедуре
    #32779125
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2фффф ффффВ версии 8.0 в pl/pgsql добавили возможность перехвата исключений уже радует. Сенькс.

А как насчет updatable cursor ? Уже есть? А то в Unsupported Features для PostgreSQL 7.4beta4 Documentation видим:
Код: plaintext
1.
2.
F831        Full cursor update   
F831- 01    Updatable scrollable cursors   
F831- 02    Updatable ordered cursors   

- т.ч. не очень даже и понятно, накера тогда курсоры открывать. (опять же вразумительный поиск по условию в курсорах я не обнаружил - видимо самому предлагается поиск посредством полного скролирования осуществлять?). Это, впрочем, может статься и к лучшему - меньше соблазнов уклониться от лобового юзанья SQL.

Или я чего-то, как обычно, не догоняю?
...
Рейтинг: 0 / 0
Обработка любой ошибки в процедуре
    #32787827
hastler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ффффВ версии 8.0 в pl/pgsql добавили возможность перехвата исключений по образцу Oracle:


Ага, только использовать неполучается - сильно тормозит :(
...
Рейтинг: 0 / 0
Обработка любой ошибки в процедуре
    #32788367
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hastler ффффВ версии 8.0 в pl/pgsql добавили возможность перехвата исключений по образцу Oracle:


Ага, только использовать неполучается - сильно тормозит :(

Чуть подробнее, если можно.

Тормозит всегда, или только при генерации исключения, нужны ли какие-то
особые причины для торможения, типа большого уровня вложенности или
очень длинной транзакции?
...
Рейтинг: 0 / 0
Обработка любой ошибки в процедуре
    #32795791
hastler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня процедура в цикле выполняется. Так вот, при добавлении EXCEPTION скорость работы уменьшается в ~10 раз, вне зависимости срабатывает исключение или нет. Я так понимаю, это что-то вроде вложенной транзакции, запуск которой и кушет время.

Однако, остается надежда что в релизе ситуация улучшится :)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обработка любой ошибки в процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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