Как уже говорили другие, вы должны проверить SQL State, но я игнорирую предупреждения. Есть большая вероятность, что последняя строка в вашем курсоре вызывает предупреждение, а не ошибку. Таким образом, STR SQL будет показывать записи, но, так как вы вспыхиваете предупреждение (но не указываете, что это может быть), вы ничего не получаете.
Вот код проверки ошибок, который я поставил после фактически каждое SQL утверждение в моих программах.
exec sql
...
if %subst(sqlstate: 1: 2) < '00' or %subst(sqlstate: 1: 2) > '02';
exec sql get diagnostics condition 1
:message = message_test;
SendSqlMsg(message);
endif;
Некоторое объяснение здесь - это сообщение varchar (6000), а SendSqlMsg () - это подпрограмма, которую я написал для отправки сообщения escape.
Дополнительная информация о классах SQLSTATE (первые 2 символа SQLSTATE):
- 00 - нормальное завершение
- 01 - предупреждения
- 02 - нет данных
Все остальное - ошибка.
Еще одно замечание. Я сказал, что ставлю это практически после каждого оператора SQL, но я не проверяю его после закрытия курсора. Вот причина этого. Единственное состояние, которое выбрасывает CLOSE
, это «курсор уже закрыт». Мне все равно, если закрыть курсор по этой причине не удалось, так как я хочу, чтобы курсор был закрыт, и он закрылся, нет проблем.