powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обработка ошибок. Хранимая процедура (StoredProc)
6 сообщений из 6, страница 1 из 1
Обработка ошибок. Хранимая процедура (StoredProc)
    #32462714
mr.Tim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FB 1.5
Имеем процедуру, которая при обновлении основной таблицы TABL1 пишет лог LOG1.
Естественно нужно знать, что там происходит, поэтому заведены две переменные ERR_Ins и ERR_Upd.
На клиенте они анализируются.
Если ERR_Ins <> 0 стало быть ошибка при записи в лог.
И если ERR_Upd <> 0 - ошибка при обновлении основной табл.

Вот код ХП:

--------------------------------------------

CREATE PROCEDURE PROC1 (...)
RETURNS (
ERR_Ins INTEGER,
ERR_Upd INTEGER)
AS
BEGIN
/* это неопределенные значения */
ERR_Ins = 1;
ERR_Upd = 1;

begin
/* пишем в лог */
INSERT INTO LOG1 (
...
VALUES (
...
);

when any do begin
ERR_Ins = SQLCODE;
EXCEPTION EXC_ERR;
exit;
end
end

begin
UPDATE TABLE1
SET
...
WHERE (...);

when any do begin
ERR_Upd = SQLCODE;
EXCEPTION EXC_ERR;
exit;
end
end

/* если все в порядке */
ERR_Ins = 0;
ERR_Upd = 0;
END

--------------------------------------------



Вот код на клиенте:

--------
try
...
IBStoredProc1.UnPrepare;
IBStoredProc1.ParamByName(...)...
...
IBTransaction1.StartTransaction;
try
IBStoredProc1.Prepare;
IBStoredProc1.ExecProc;
err_ins := IBStoredProc1.ParamByName('ERR_Ins').AsInteger;
err_upd := IBStoredProc1.ParamByName('ERR_Upd').AsInteger;
if (Err_ins <> 0) or (Err_upd <> 0) then raise Exception.Create('Ошибка!');
except
IBTransaction1.Rollback;
raise;
end;
IBTransaction1.Commit;
...
finally
... {закрытие транзакций, обновление датасетов, etc.}
end;
--------


Все идет хорошо. Но у осн. таблицы TABL1 есть триггер after update.
Если этот триггер отключен, то все ошибки ловятся в ХП. Если включен, то
любые ошибки в ХП в UPDATE этот триггер "маскирует", т.е. 'err_upd' всегда = 0.
Чего делать?
Может есть красивый способ?
На ум приходит только вариант,- отдельным запросом проверить наличие в осн. таблице
изменившейся записи.
...
Рейтинг: 0 / 0
Обработка ошибок. Хранимая процедура (StoredProc)
    #32462733
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Основная задача какая?
Почему при записи в лог может произойти ошибка?
...
Рейтинг: 0 / 0
Обработка ошибок. Хранимая процедура (StoredProc)
    #32463168
mr.Tim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Основная задача: показать клиенту что он не прав, например, если он в поля not null ничего не введет, а я забуду на клиенте это предупредить.
...
Рейтинг: 0 / 0
Обработка ошибок. Хранимая процедура (StoredProc)
    #32463563
mr.Tim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще хотел добавить, что LOG1 - это НЕ просто лог SQL запросов (в этом случае как раз-таки все очень просто).
Это некий осмысленный журнал, например, перемещений компьютерной техники (кто, когда, откуда, куда, почему, и т.д.).
...
Рейтинг: 0 / 0
Обработка ошибок. Хранимая процедура (StoredProc)
    #32468854
mr.Tim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема разрешилась.
По рекомендации больших умов
http://www.ibase.ru/devinfo/pslock.htm
похачил я в свое время
procedure TIBSQL.ExecQuery;
и благополучно забыл об этом.
Теперь вернул все взад.
Всё стало ОК.
Всем спасибо.
...
Рейтинг: 0 / 0
Обработка ошибок. Хранимая процедура (StoredProc)
    #32468857
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну-ка, ну-ка. Пободробнее, плс. Ибо упрёк в этом чую.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обработка ошибок. Хранимая процедура (StoredProc)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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