Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры из триггера / 5 сообщений из 5, страница 1 из 1
12.07.2007, 15:19
    #34656840
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры из триггера
DB2 v9.1 Fix #2: "Сервер баз данных = DB2/NT 9.1.2", WinXP SP2
Имеем триггер на ловлю изменения поля CUSTOUTDATE с NULL на дату:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER SC.UpdCustOutDate
AFTER UPDATE OF CUSTOUTDATE ON SC.TABLE1
REFERENCING NEW AS N OLD AS O
FOR EACH ROW MODE DB2SQL
WHEN(O.CUSTOUTDATE IS NULL AND N.CUSTOUTDATE IS NOT NULL)
BEGIN ATOMIC
  DECLARE OUTCODE INTEGER;
  CALL SC.ADDCAR(O.ID,OUTCODE);
END@
Хранимая процедура (ХП) описана как (написана на C):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE PROCEDURE SC.ADDCAR(
  IN CarOrderID INT,
  OUT ErrorCode INTEGER )
      DYNAMIC RESULT SETS  0 
      LANGUAGE C
      PARAMETER STYLE SQL
      NO DBINFO
      FENCED
      MODIFIES SQL DATA
      PROGRAM TYPE SUB
      EXTERNAL NAME 'addcar!addcar';
Хотелось бы чтобы триггер возвращал ошибку, которую выдает ХП.
Попытка добавить "DECLARE SQLCODE INTEGER DEFAULT 0;" выдает ошибку:
Код: plaintext
1.
2.
SQL0056N  Объявление переменной SQLSTATE или SQLCODE находится во вложенном 
составном операторе.  LINE NUMBER= 7 .  SQLSTATE= 42630 
Вариант (не правильный, привожу только для описания принципа, взято из хелпа):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TRIGGER SC.UpdCustOutDate
AFTER UPDATE OF CUSTOUTDATE ON SC.TABLE1
REFERENCING NEW AS N OLD AS O
FOR EACH ROW MODE DB2SQL
WHEN(O.CUSTOUTDATE IS NULL AND N.CUSTOUTDATE IS NOT NULL)
BEGIN
  DECLARE OUTCODE INTEGER;
  CALL SC.ADDCAR(O.ID,OUTCODE);
  GET DIAGNOSTICS OUTCODE=RETURN_STATUS;
  VALUES(CASE WHEN OUTCODE !=  0  THEN RAISE_ERROR('70001', 'PROC CALL failed'));
END@
возвращает только факт, но не реальный код ошибки.
Вообще, принципиально, возможно или нет вернуть код, возвращаемый ХП? Я могу использовать вызов ХП и из другого места, но мне интересен сам факт наличия или отсутствия такой возможности. Может кто сталкивался с такой проблемой?
Вчерашние поиски в этом форуме и в доках ничего не дали.
Поиск продолжается.
...
Рейтинг: 0 / 0
12.07.2007, 15:50
    #34657000
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры из триггера
Триггер не может возвращать никаких кодов.
В триггере вы можете сгенерировать исключение, в зависимости от условия (как вы это и делаете).
Объясните подробнее, что вы хотите сделать с кодом ошибки, который возвращает ХП?
...
Рейтинг: 0 / 0
12.07.2007, 16:24
    #34657152
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры из триггера
Mark BarinsteinТриггер не может возвращать никаких кодов.
В триггере вы можете сгенерировать исключение, в зависимости от условия (как вы это и делаете).
Объясните подробнее, что вы хотите сделать с кодом ошибки, который возвращает ХП?
При сохранении записи в SC.TABLE1 и указании даты в поле CUSTOUTDATE после записи в таблицу сработает триггер. В случае ошибки, триггер сгенерирует exception и в вызывающую программу sqlcode из ХП не попадет, поскольку в этом случае всегда выдается sqlcode = -438. В принципе можно получить SQLSTATE, передавая его OUT параметром из ХП и выбросить его в SIGNAL, вот только я не знаю достаточно ли этого для формирования сообщения об ошибке в вызывающей программе. Пора повторять матчасть и в отпуск :) Сейчас попробую.
Другой вариант прямо вызывать в программе эту ХП после сохранения записи, но это потребует доработки вызывающей программы, да и нет "страховки", на случай, если дату установят "вручную" (скриптом), потому пытаюсь сделать более правильно.
...
Рейтинг: 0 / 0
12.07.2007, 16:42
    #34657249
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры из триггера
Если надо возвратить программе код из процедуры, можно передать его строковое представление через diagnostic message (2-параметр RAISE_ERROR), а потом в приложении его поймать.
Только уберите get diagnostics и case правльно напишите...
...
Рейтинг: 0 / 0
12.07.2007, 16:56
    #34657322
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры из триггера
Mark BarinsteinЕсли надо возвратить программе код из процедуры, можно передать его строковое представление через diagnostic message (2-параметр RAISE_ERROR), а потом в приложении его поймать.
Вот тут то и "засада", поскольку ловить - это значит дорабатывать, а ведь ошибку может выдать не триггер, а сам процесс сохранения, т.е. до триггера дело может и не дойти. Я понимаю, что тоже можно выкрутиться, но как то хотелось сделать стандартно. Ну раз не судьба, тогда будем искать приемлемый вариант из "кривых". Спасибо за информацию.
Mark BarinsteinТолько уберите get diagnostics и case правльно напишите...
Это да, спасибо, я уже правлю сижу, а этот пример брал из хелпа, а там так и написано (case) :)
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры из триггера / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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