Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Возврат кода ошибки из хранимой процедуры / 18 сообщений из 18, страница 1 из 1
30.07.2007, 17:50
    #34693721
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
Есть ХП, которая создает курсор, с помощью которого модифицирует таблицы. При выходе из ХП необходимо курсор закрыть. Т.е. автоматически это потеря кода ошибки. Что в случае нормального завершения (здесь нет проблем, код все равно равен 0), что в случае возникновения ошибки.
Сохранение sqlca.sqlcode и восстановление его после закрытия курсора не помогает, очевидно надо сохранять всю структуру sqlca, собственно это логично. Другой вариант - возвращать код в виде выходного параметра.
Может быть есть какой то более цивилизованный (правильный) способ?
Вот примерный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  EXEC SQL INCLUDE SQLCA;
...
  EXEC SQL WHENEVER SQLERROR   GOTO error_exit;
  EXEC SQL WHENEVER SQLWARNING CONTINUE;
...
  EXEC SQL
   DECLARE TO_ADDCAR_1 CURSOR FOR
    SELECT OID,LASTDATE
      FROM SHL.TOCARORDER
     WHERE EXECCNT= 0  AND BRANDID=:brandid
       FOR UPDATE OF EXECCNT;
...
  for(;;)
  {
    EXEC SQL
       FETCH TO_ADDCAR_1 INTO :oid,:lastdate:lastdate_ind;
    if( sqlca.sqlcode !=  0  ) break;
...
  }
  EXEC SQL CLOSE TO_ADDCAR_1;
  return(SQLZ_HOLD_PROC);

error_exit:
  strcpy(SQLUDF_STATE,sqlca.sqlstate);
  strcpy(SQLUDF_MSGTX,sqlStmtInfo);

  EXEC SQL CLOSE TO_ADDCAR_1; /* 1 */
  return(SQLZ_HOLD_PROC);
Если строку /* 1 */ убрать, то возвращается ошибка с кодом 464.
Доки пока ничего не дают, вроде написано все корректно, с точки зрения ограничений на ХП.
Решение найдется, хотелось бы понять, может я что-то неправильно делаю?
...
Рейтинг: 0 / 0
31.07.2007, 11:35
    #34694934
ппм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
может, использовать SIGNAL ?
...
Рейтинг: 0 / 0
31.07.2007, 11:52
    #34694996
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
1.
SQL0464W - это не ошибка, а предупреждение.
2.
Код ошибки (или sqlstate) можно (и я считаю, что нужно) возвращать в выходном параметре.
...
Рейтинг: 0 / 0
31.07.2007, 15:00
    #34695779
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
Mark Barinstein1.
SQL0464W - это не ошибка, а предупреждение.
2.
Код ошибки (или sqlstate) можно (и я считаю, что нужно) возвращать в выходном параметре.
1. Да, 4 глаза не помогли 8) (очки)
Выводы следующие:
1. Возвращать sqlcode как параметр и его анализировать. (Сейчас анализируется "штатный" sqlcode, а он "кривой"). Получилось нормально, работает.
2. Аналогично, возвращать sqlstate. Пока есть несуразности, сейчас разрулю.
Спасибо за мысли :)
...
Рейтинг: 0 / 0
31.07.2007, 15:12
    #34695834
ппм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
imho declare condition с последующим signal этого condition более понятно.
Или я чего-то не понял.
...
Рейтинг: 0 / 0
31.07.2007, 15:56
    #34696045
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
ппмimho declare condition с последующим signal этого condition более понятно.
Или я чего-то не понял.
Я Ваше сообщение видел, но пока не проверил, а потому не ответил.
Работы как всегда выше крыши, да еще постоянно отвлекают. :) :(
...
Рейтинг: 0 / 0
31.07.2007, 16:32
    #34696189
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
ппмimho declare condition с последующим signal этого condition более понятно.

Собственно у меня есть хранимая процедура внешняя, написанная на С. Как в ней использовать SIGNAL и иже с ним не понятно.
Обработчик ошибок у меня и так есть, декларирование здесь:
Код: plaintext
1.
2.
EXEC SQL WHENEVER SQLERROR   GOTO error_exit;
EXEC SQL WHENEVER SQLWARNING CONTINUE;
Обработка, собственно на метке error_exit .
Поэтому сигналы (я имею в виду команду SIGNAL) здесь не нужны, ведь я знаю код ошибки в обработчике и могу его сохранить, передать как выходной параметр.
2 Mark Barinstein :
Я нашел в примерах SQLLIB использование курсора во внешней ХП, там они курсор просто не закрывают. Мысль понятна, поскольку курсор закроется при ROLLBACKе. Думаю, что у них тоже не все чисто, sqlstate затрется, сейчас проверю.
...
Рейтинг: 0 / 0
31.07.2007, 16:42
    #34696223
ппм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
передать как выходной параметр - это одно.
Но ведь вы получили sqlcode и sqlstatem,
а прользователю "подсовываете" осетрину второй свежести - выходной параметр.

Почему бы и ему не вернуть sqlcode и sqlstate с помощью declare condition & signale <condition> set text, например.
Тогда ваш пользователь тоже получит "нормальную" ошибку.

Это, видимо, вопрос личных предпочтений.
...
Рейтинг: 0 / 0
31.07.2007, 17:20
    #34696327
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
ппмпередать как выходной параметр - это одно.
Но ведь вы получили sqlcode и sqlstatem,
а прользователю "подсовываете" осетрину второй свежести - выходной параметр.

Почему бы и ему не вернуть sqlcode и sqlstate с помощью declare condition & signale <condition> set text, например.
Тогда ваш пользователь тоже получит "нормальную" ошибку.

Это, видимо, вопрос личных предпочтений.
Я понимаю о чем Вы, в конечном итоге, возможно, выходной параметр отпадет сам собой, поскольку будет не нужен. Я согласен, что способ с выходным параметром не достаточно красивый.
Посмотрим полный текст обработчика:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
error_exit:

  EXEC SQL WHENEVER SQLERROR CONTINUE;

  *oExecCount = execcount;

  strcpy(SQLUDF_STATE,sqlca.sqlstate);
  strcpy(SQLUDF_MSGTX,sqlStmtInfo);

  return(SQLZ_HOLD_PROC);
1. Здесь sqlcode & sqlstate в чистом виде уходят в вызывающую программу.
Какой смысл добавлять сюда еще что-то?
2. Не уверен, что EXEC SQL SIGNAL ... можно использовать во внешней ХП, поскольку такая ХП всегда завершается командой return ... в доках по этому поводу не очень адекватно. Даже если это возможно, предполагаю, что SIGNAL вернет только sqlstate, но не sqlcode.
...
Рейтинг: 0 / 0
01.08.2007, 13:20
    #34697843
ппм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
насколько я помню, есть sample внешней SP с SIGNAL.
А по поводу что она вернет - гадать не надо, дока достаточно полно определяет
http://publib.boulder.ibm.com/infocenter/db2luw/v9//topic/com.ibm.db2.udb.admin.doc/doc/r0004232.htm

If a SIGNAL statement is issued, the SQLCODE returned is based on the SQLSTATE as follows:

* If the specified SQLSTATE class is either '01' or '02', a warning or not found condition is returned and the SQLCODE is set to +438.
* Otherwise, an exception condition is returned and the SQLCODE is set to -438.

The other fields of the SQLCA are set as follows:

* sqlerrd fields are set to zero
* sqlwarn fields are set to blank
* sqlerrmc is set to the first 70 bytes of MESSAGE_TEXT
* sqlerrml is set to the length of sqlerrmc, or to zero if no SET MESSAGE_TEXT clause is specified
* sqlerrp is set to ROUTINE.

Пойдёт это вам или нет, смотрите.
...
Рейтинг: 0 / 0
01.08.2007, 17:49
    #34699112
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
ппмнасколько я помню, есть sample внешней SP с SIGNAL.
А по поводу что она вернет - гадать не надо, дока достаточно полно определяет
http://publib.boulder.ibm.com/infocenter/db2luw/v9//topic/com.ibm.db2.udb.admin.doc/doc/r0004232.htm

If a SIGNAL statement is issued, the SQLCODE returned is based on the SQLSTATE as follows:

* If the specified SQLSTATE class is either '01' or '02', a warning or not found condition is returned and the SQLCODE is set to +438.
* Otherwise, an exception condition is returned and the SQLCODE is set to -438.


Пойдёт это вам или нет, смотрите.
Отсюда видно, что исходный sqlcode будет утерян, увы.

Пробовал я убрать закрытие курсора в случае ошибки, увы, сбрасывается и sqlstate и sqlcode, поскольку возвращает Warning с SQLSTATE 464.

Все таки если хочется корректного sqlcode & sqlstate, придется возвращать их в выходных параметрах. Просто будет стоять проверка, если стандартный sqlcode 0, то проверять тот, что вернула ХП.
Особенно важно это пока не отлажена ХП, потом будет проще, хотя для быстрого поиска ошибок знать конкретные sqlcode & sqlstate очень важно и в процессе эксплуатации программы.
...
Рейтинг: 0 / 0
01.08.2007, 18:45
    #34699294
Nikolay Kulikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
RESIGNAL?
...
Рейтинг: 0 / 0
02.08.2007, 11:05
    #34700397
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
Nikolay KulikovRESIGNAL?
Если использовать эту технологию, то согласен, это было бы то, что надо. RESIGNAL без параметров.

Но вопрос останется, как не крути, если курсор закрыть, то sqlca изменится, а если не закрывать, то sqlca все равно изменится :)
Куда не кинь - всюду клин.
Сегодня точно добью конечный вариант с возвратом кода и статуса ошибки в виде выходных параметров. Это и будет окончательный вариант.
...
Рейтинг: 0 / 0
06.08.2007, 12:00
    #34707298
ппм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
ну это же типичный случай, даже если взять вот за пример вывод сообщений об ошибках db2,
зачастую идёт сообщение с одним SQLSTATE, внутри него сообщение с другим SQLSTATE sqlcode, а в нём может быть вложенное еще одно.
Вкладывайте на здоровье, используя text messages.
...
Рейтинг: 0 / 0
06.08.2007, 13:57
    #34707759
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
ппмну это же типичный случай, даже если взять вот за пример вывод сообщений об ошибках db2,
зачастую идёт сообщение с одним SQLSTATE, внутри него сообщение с другим SQLSTATE sqlcode, а в нём может быть вложенное еще одно.
Вкладывайте на здоровье, используя text messages.
RESIGNAL может быть использован только в SQL procedures , в external SQL procedures он использоваться не может. Взято из таблицы 5 (страница 55) файла с1043730.pdf ("Developing SQL and External Routines").
SIGNAL аналогично, но он может дополнительно использоваться в SQL functions.
...
Рейтинг: 0 / 0
06.08.2007, 15:07
    #34708036
ппм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
да я безотносительно resignal сказанул.
Хотя, в доке по signal/resignal сказано
"This statement can only be embedded in an SQL procedure. It is not an executable statement and cannot be dynamically prepared."
Интересно было бы эту табличку посмотреть.
Как она озаглавлена, чтобы найти её в Information Center?
...
Рейтинг: 0 / 0
06.08.2007, 15:49
    #34708216
ппм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
нашёл - http://publib.boulder.ibm.com/infocenter/db2luw/v9//topic/com.ibm.db2.udb.apdv.sql.doc/doc/r0020478.htm
ну, собственно, выбора нет.
В вашем случае.
...
Рейтинг: 0 / 0
07.08.2007, 10:22
    #34709619
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат кода ошибки из хранимой процедуры
Самое прикольное я тут столкнулся с проблемой, что у меня в случае ошибки в этой ХП, OUT параметр не возвращается, хотя в логах моих все ок. Уже доки изрыл, но нигде про такое не написано.
ESE 9.1.3 for Windows.

А по существу дела да, sqlcode не возвращается, я его сунул сюда пока:

sprintf(SQLUDF_MSGTX,"%d: ",sqlca.sqlcode);
strncat(SQLUDF_MSGTX,sqlStmtInfo,60);
SQLUDF_MSGTX[59] = '\0';

А вот SQLSTATE нормально возвращается, даже если закрывать курсор, что я сейчас и делаю.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Возврат кода ошибки из хранимой процедуры / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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