|
|
|
Обработка ошибок. Хранимая процедура (StoredProc)
|
|||
|---|---|---|---|
|
#18+
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. Чего делать? Может есть красивый способ? На ум приходит только вариант,- отдельным запросом проверить наличие в осн. таблице изменившейся записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2004, 17:31 |
|
||
|
Обработка ошибок. Хранимая процедура (StoredProc)
|
|||
|---|---|---|---|
|
#18+
Основная задача какая? Почему при записи в лог может произойти ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2004, 17:40 |
|
||
|
Обработка ошибок. Хранимая процедура (StoredProc)
|
|||
|---|---|---|---|
|
#18+
Основная задача: показать клиенту что он не прав, например, если он в поля not null ничего не введет, а я забуду на клиенте это предупредить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2004, 09:05 |
|
||
|
Обработка ошибок. Хранимая процедура (StoredProc)
|
|||
|---|---|---|---|
|
#18+
Еще хотел добавить, что LOG1 - это НЕ просто лог SQL запросов (в этом случае как раз-таки все очень просто). Это некий осмысленный журнал, например, перемещений компьютерной техники (кто, когда, откуда, куда, почему, и т.д.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2004, 11:56 |
|
||
|
Обработка ошибок. Хранимая процедура (StoredProc)
|
|||
|---|---|---|---|
|
#18+
Проблема разрешилась. По рекомендации больших умов http://www.ibase.ru/devinfo/pslock.htm похачил я в свое время procedure TIBSQL.ExecQuery; и благополучно забыл об этом. Теперь вернул все взад. Всё стало ОК. Всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2004, 12:19 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32468854&tid=1578900]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 258ms |
| total: | 415ms |

| 0 / 0 |
