Ded wrote:

Roman Rokytskyy wrote:
Например Ты хочешь сделать аналог MERGE или REPLACE (не помню, что там в Вулкане сейчас) - если строка с PK уже есть, то делать UPDATE, а если нет - INSERT.

Понятно, можно сделать сначала SELECT, посмотреть нашли ли чего, и тогда решить. Но, если в 99% случаев будет идти INSERT и только в 1% - UPDATE, ты будешь вызывать лишний SELECT в 99% случаев, что не есть эффективно.

А по-моему разработчик приложения лучше знает где у него что преимущественно, и в функциях преимущественного апдейта его и будет делать и проверять Row_Count, в случаях преимущественного инсёрта - инсёртить, ловить эксепшн и проверять именно код, а в среднем случае поступит как написано на скрижалях ibase. Имхо бессмыссленная это автоматизация, ловушка для неофита.

SELECT count(*) FROM bla WHERE pk = ? + UPDATE будет эквивалентна соотв. INSERT+UPDATE только тогда, когда используется isc_exec_immed2 для селекта, в остальных случаях она генерирует на 2 сетевых пакета больше. И я имею основания полагать, что isc_dsql_exec_immed2 ни Дельфийскими, ни Си-шарпнутыми, ни Явушными компонентами в этом случае использоватся не будет, а все пойдет через isc_dsql_exec2 + isc_dsql_fetch + isc_dsql_free. Хотя я не могу сказать, что будет работать быстрее на самом сервере, SELECT или же INSERT, - теор. селект должен быть немного быстрее.

Но это был только пример для обработки ошибки по условию, может не совсем удачный. У меня в тест-кейсах к драйверу таблицы создаются автоматически перед исполнением тест-кейса и после исполнения удаляются. И та же конструкция используется во время создания таблиц для тестов - сначала DROP, ели не нашли таблицы - пофиг, а если что-то другое - тогда ой! И только после этого идет CREATE.

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

Роман

Ответить