powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Возврат кода ошибки из хранимой процедуры
18 сообщений из 18, страница 1 из 1
Возврат кода ошибки из хранимой процедуры
    #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
Возврат кода ошибки из хранимой процедуры
    #34694934
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может, использовать SIGNAL ?
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #34694996
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.
SQL0464W - это не ошибка, а предупреждение.
2.
Код ошибки (или sqlstate) можно (и я считаю, что нужно) возвращать в выходном параметре.
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #34695779
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein1.
SQL0464W - это не ошибка, а предупреждение.
2.
Код ошибки (или sqlstate) можно (и я считаю, что нужно) возвращать в выходном параметре.
1. Да, 4 глаза не помогли 8) (очки)
Выводы следующие:
1. Возвращать sqlcode как параметр и его анализировать. (Сейчас анализируется "штатный" sqlcode, а он "кривой"). Получилось нормально, работает.
2. Аналогично, возвращать sqlstate. Пока есть несуразности, сейчас разрулю.
Спасибо за мысли :)
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #34695834
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
imho declare condition с последующим signal этого condition более понятно.
Или я чего-то не понял.
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #34696045
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ппмimho declare condition с последующим signal этого condition более понятно.
Или я чего-то не понял.
Я Ваше сообщение видел, но пока не проверил, а потому не ответил.
Работы как всегда выше крыши, да еще постоянно отвлекают. :) :(
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #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
Возврат кода ошибки из хранимой процедуры
    #34696223
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
передать как выходной параметр - это одно.
Но ведь вы получили sqlcode и sqlstatem,
а прользователю "подсовываете" осетрину второй свежести - выходной параметр.

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

Это, видимо, вопрос личных предпочтений.
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #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
Возврат кода ошибки из хранимой процедуры
    #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
Возврат кода ошибки из хранимой процедуры
    #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
Возврат кода ошибки из хранимой процедуры
    #34699294
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESIGNAL?
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #34700397
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nikolay KulikovRESIGNAL?
Если использовать эту технологию, то согласен, это было бы то, что надо. RESIGNAL без параметров.

Но вопрос останется, как не крути, если курсор закрыть, то sqlca изменится, а если не закрывать, то sqlca все равно изменится :)
Куда не кинь - всюду клин.
Сегодня точно добью конечный вариант с возвратом кода и статуса ошибки в виде выходных параметров. Это и будет окончательный вариант.
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #34707298
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну это же типичный случай, даже если взять вот за пример вывод сообщений об ошибках db2,
зачастую идёт сообщение с одним SQLSTATE, внутри него сообщение с другим SQLSTATE sqlcode, а в нём может быть вложенное еще одно.
Вкладывайте на здоровье, используя text messages.
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #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
Возврат кода ошибки из хранимой процедуры
    #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
Возврат кода ошибки из хранимой процедуры
    #34708216
ппм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашёл - http://publib.boulder.ibm.com/infocenter/db2luw/v9//topic/com.ibm.db2.udb.apdv.sql.doc/doc/r0020478.htm
ну, собственно, выбора нет.
В вашем случае.
...
Рейтинг: 0 / 0
Возврат кода ошибки из хранимой процедуры
    #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
18 сообщений из 18, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Возврат кода ошибки из хранимой процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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