November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Sunday, June 5th, 2011 10:44 pm

Ну конечно, я на них наступил.

Типичная последовательность действий при работе с базой данных: prepare(), execute(), если надо прочитать результат – fetch(), ну и в конце finish(). И до сих пор всё работало.

И тут ВНЕЗАПНО оказалось, что если выполняется не обычный SQLный оператор, а хранимая процедура (посредством EXECUTE PROCEDURE), то возникшая при выполнении ошибка после execute() никак не проявляется. Типа, всё нормально выполнилось. А вот когда потом делаешь fetch(), тут-то ошибка и вылезает. Более того, если процедура ничего не возвращает, то ошибка не проявляется вовсе. И процедура, кажется, вообще не выполняется, пока не сделаешь fetch(). Да-да, fetch(), который заведомо ничего вернуть не может.

В документации, естественно, эта замечательная особенность не описана. И я, как обычно, на эти грабли наступил и потратил полдня, чтоб понять, какого хрена оно молча не работает.

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

Monday, June 6th, 2011 07:12 am (UTC)
А если не вернул, как в случае ничего не возвращающей процедуры?
Monday, June 6th, 2011 07:18 am (UTC)
если не вернул, ничего не делают. В этом случае и фетч нельзя сделать.

В общем-то им даже проще, предполагается что есть два типа sql, возвращающие курсор и не возвращающие, поэтому первые вызываются sql.open а вторые sql.exec. Первые всегда фетчатся вторые никогда, правда они проверяют все равно вернулся курсор или нет.
Monday, June 6th, 2011 07:29 am (UTC)
А вот у меня получается, что ошибку становится видно только после вызова fetch(), который заведомо ничего вернуть не может.
Monday, June 6th, 2011 07:31 am (UTC)
В описании процедуры слово RETURNING есть или нет?
Monday, June 6th, 2011 08:09 am (UTC)
Нет, а то б она была функцией.
В моём случае возвращать ей нечего, она добавляет запись в таблицу, предварительно проводя некоторые логические проверки, не реализованные на уровне constraint'ов. Если какие-то проверки не прошли, генерирует ошибку.