Вы изучаете основы Perl и Sybase и делаете несколько неверных выводов.
Забудьте о том, что он делает под ODBC на мгновение. Скорее всего, в ODBC включен AUTOCOMMIT, и, таким образом, вы не имеете никакого контроля транзакций. (Почему кто-то будет использовать ODBC, когда DBD :: поддерживает DB-Lib и CT-Lib мне не подходит, но это отдельная история.)
Re: "Похоже, что каждый подготовленный оператор должен выполняться в Sybase."
Rawheiser правильный. Чего именно вы ожидаете достичь, готовя партию, а вместо этого выполняя Do? Где еще вы ожидаете выполнить пакет, подготовленный в Sybase, кроме Sybase?
Существуют ли различия между подготовкой и выполнением. Подготовка / выполнение для Sybase прекрасно работает в миллионах программ. вам просто нужно узнать, что он делает, а не то, что, по вашему мнению, он должен делать. подготовим давайте загрузим пакет, блок команд, завершенных GO в обычном смысле Sybase. Execute выполняет подготовленный пакет (передает GO и отправляет пакет на сервер) и захватывает все, что возвращается (в зависимости от того, какой массив / переменные вы установили).
Do - немедленная, единственная команда без подготовки. Подготовка + выполнение вместе взятых.
Выполнение только однократных операторов и только динамического SQL, просто потому, что это все, что вы можете получить, очень ограниченно и совершенно не нужно.
В данный момент у вас есть:
Приготовьте:
UPDATE
Execute (100)
ExecuteImmediate(Do):
COMMIT TRAN
Так что, конечно, нет BEGIN TRAN. (Выполнено первое «do», BEGIN TRAN пропал)
Я думаю, что вы хотите (изначально задумано) это. Забудьте «сделать»:
Подготовка:
BEGIN TRAN
UPDATE
COMMIT TRAN
Выполнить (100)
Затем измените его на:
BEGIN TRAN
INSERT
UPDATE
COMMIT TRAN
Выполнить (100)
Ваши $ update и $ insert приведут вас в замешательство (вы выполняете пакет из нескольких операторов, верно? Не отдельная отдельная команда в середине пакета подготовки). Если вы избавитесь от них и будете думать с точки зрения $ execute [независимо от того, что вы подготовили в пакете], это может помочь вам лучше понять проблему.
Не делайте выводов, пока все вышеперечисленное не будет работать как задумано.
И почитайте о BEGIN / COMMIT TRAN.
Последнее, что такое "END TRAN
"? Я не думаю, что блок кода, который вы разместили, является реальным.