Так в сценарии, где «таблица» не имеет столбец «С», то запрос будет быть недействительным, делая дескриптор $ sth недействительным и не выполнив. Правильно?
Непонятно, что вы подразумеваете под «недействительным».
Некоторые водители, как и DBD :: Oracle, может отправить заявление SQL на сервер при вызове prepare
, в этом случае ошибка будет обнаружена сервером и prepare
потерпит неудачу, возвращая UNDEF. (Смотри также @ записку Бородина о RaiseError.)
Если водитель не отправить заявление на сервер, когда prepare
вызывается тогда драйвер создает и возвращает дескриптор, который имеет строку оператора, хранящуюся в нем.
Теперь, в случае отказа как такового, что происходит с $ sth? Я не могу называть его завершение, потому что это неверно.
Опять же, неясно, что вы подразумеваете под «недействительным». (Мне очень полезно попытаться быть действительно ясно о концепциях и ситуациях, о которых я думаю. Принуждение к этому часто означает, что я нахожу ответы на свои собственные вопросы, потому что «проблема» была в словах, которые я был используя)
Таким образом, как я описал выше, либо prepare
не удалось, и возвратил UNDEF (или выбросил исключение из-за RaiseError. - рекомендуется), или prepare
вернулся действительный $ sth-.
Если prepare
вернул undef, тогда perl выдаст исключение при попытке вызвать execute.
Если prepare
вернулся действительный $ sth- то execute
будет называться, заявление будет отправлено на сервер, сервер обнаружит ошибку, и execute
вернет ложь (или исключение, если RaiseError установлен - рекомендуется) ,
Ни в коем случае не могу назвать $ sth "invalid". Либо у вас вообще нет $ sth, потому что подготовка завершилась неудачно, либо у вас есть $ sth, что вполне допустимо, но при выполнении ошибки.
В этом случае, если вы звоните $sth->finish
, это будет работать, но, поскольку @ThisSuitIsBlackNot правильно отметил, это было бы бессмысленно. (Я должен был переименовать finish
в discard_pending_rows
много лет назад.)
Спасибо за все ответы. Они оба очень полезны. –