powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / AS400 DB2, errors handling
5 сообщений из 5, страница 1 из 1
AS400 DB2, errors handling
    #39878426
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Уважаемые знатоки, подскажите..
По работе поддерживаем некий ETL процесс на DB2 сервере, построенный на множесве хранимых процедур.
Пытаюсь встроить в них обработку и логгирование ошибок, ориентируясь на примеры отсуда
https://www.itjungle.com/2017/10/30/guru-logging-sql-errors-warnings/
В моем коде это выглядит таким образом
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
BEGIN
	
    DECLARE LOG_ID BIGINT;
    DECLARE SQLCODE INT DEFAULT 0;
    DECLARE SQLCODE_EXCEPTION INT DEFAULT 0;
    DECLARE ERR_MESSAGE VARCHAR(5000) DEFAULT '';
    ---exception handling and logging
	DECLARE EXIT HANDLER FOR SQLEXCEPTION, NOT FOUND
	BEGIN
	SET SQLCODE_EXCEPTION=SQLCODE;
	 GET DIAGNOSTICS EXCEPTION 1  ERR_MESSAGE=MESSAGE_TEXT;		 
			IF LOG_ID IS NOT NULL THEN
			 INSERT INTO FSTEST01 . BUILDLOG_ERRORS ( BUILDLOG_ID ,SQL_CODE,   ERROR_INFO ) VALUES ( LOG_ID,SQLCODE_EXCEPTION,'ERR_MESSAGE='||ERR_MESSAGE);
			END IF;	
		 RESIGNAL;
	END;     
    SELECT BUILDLOG_ID INTO LOG_ID
	FROM FINAL TABLE
	(INSERT INTO FSTEST01 . BUILDLOG ( LIBRARY , PROCEDURE , VERSION ) VALUES ( SysIBM.Routine_Schema , SysIBM.Routine_Specific_Name , '1.15' )) ;
---main part of SP
		TRUNCATE TABLE FSTEST01 . SHINDUSTRY ;
...


То есть по замыслу хранимка, словив произвольный SQL exception, пишет сначала запись об этом в лог, после этого снова его же выкидывает.
Все работает нормально, за исключением того, что обработчик реагирует не только на exception, но на на waring.
-например, если пытаться сделать truncate пустой таблицы, в лог упадет запись SQL_CODE=100, Row not found to truncate.
Обернуть каждый truncate в условие, - в теории можно, но хотелось бы понять, что не так.
Как сделать чтобы warngings просто игнорировались?
Спасибо
...
Рейтинг: 0 / 0
AS400 DB2, errors handling
    #39878557
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
McCar,

Добрый день.

NOT FOUND и SQLWARNING conditions не одно и то же.
См. handler-declaration в описании compound-statement .

Не хотите ловить NOT FOUND - уберите ", NOT FOUND" из "DECLARE EXIT HANDLER".
...
Рейтинг: 0 / 0
AS400 DB2, errors handling
    #39878693
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinMcCar,

Добрый день.

NOT FOUND и SQLWARNING conditions не одно и то же.
См. handler-declaration в описании compound-statement .

Не хотите ловить NOT FOUND - уберите ", NOT FOUND" из "DECLARE EXIT HANDLER".
Хм.. точно..
Я был настолько уверен, что "NOT FOUND" - это когда обращаешься к несуществущему объекту, что даже не связал текст Warning-а при Truncate пустой таблицы и "NOT FOUND" в определении handler-а.
Спасибо.
...
Рейтинг: 0 / 0
AS400 DB2, errors handling
    #39878708
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
McCar,

А вообще код обработчика написан странно. Навряд ли тот, кто его разрабатывал, хотел получить такую логику.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
BEGIN
  SET SQLCODE_EXCEPTION=SQLCODE;
  GET DIAGNOSTICS EXCEPTION 1  ERR_MESSAGE=MESSAGE_TEXT;		 
  IF LOG_ID IS NOT NULL THEN
    INSERT INTO FSTEST01.BUILDLOG_ERRORS ( BUILDLOG_ID ,SQL_CODE,   ERROR_INFO ) 
    VALUES ( LOG_ID,SQLCODE_EXCEPTION,'ERR_MESSAGE='||ERR_MESSAGE);
  END IF;	
  RESIGNAL;
END;



Несколько проблем:

1. Команду GET DIAGNOSTICS надо выполнять первой в блоке обработчика. Связано это с тем, что в отличие от остальных команд, в т.ч. и SET, ее выполнение не приводит к неявной установке переменных SQLCODE и SQLSTATE.
В коде выше после того, как выполнена команда SET SQLCODE_EXCEPTION=SQLCODE, командой GET DIAGNOSTICS уже не поймаешь сообщение об ошибке. Она получает сообщение о предыдущей выполненной команде, в данном случае - SET, которая выполнится успешно.
Т.е. SET и GET DIAGNOSTICS надо поменять местами.

2. Сообщение появится в таблице FSTEST01.BUILDLOG_ERRORS только если в приожении (процедуре), вызывающей эту, в ответ на RESIGNAL будет делаться COMMIT. Иначе вставка в эту таблицу откатится вместе с остальными изменениями в этой транзакции. если в вызывающем приложении делается ROLLBACK в ответ на этот сигнал.
В IBM i 7.2 появились автономные процедуры, которые можно использовать для такого журналирования. Т.е. в обработчике можно вызвать такую процедуру, объявленную как autonomous, которая выполняется в своей транцакции, на которую не влияет вызывающая транзакция. И уже в этой процедуре делать INSERT INTO FSTEST01.BUILDLOG_ERRORS.
...
Рейтинг: 0 / 0
AS400 DB2, errors handling
    #39879443
McCar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, я проверю.
Хотя вроде бы и в таком виде запись сообщений об ошибке работало корректно.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / AS400 DB2, errors handling
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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