![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Oracle и транзакции.
Suntechnic © (2004-01-27 19:23:00)
Проблема в следующем. Есть некая транзакция в рамках которой происходит удаление объектов. Иногда во время удаления объектов выясняется, что необходимо создавать global temporary table для хранения промежуточных результатов. Особенность работы Oracle заключается в том, что перед выполнением DDL команды Oracle commit текущую транзакцию. И если какое-нибудь из поседующих запросов не проходит, теряется целостность данных.
Существующие решение:
1) Создавать временные таблицы в скрипте по созданию базы данных.
Не очень хочется это делать так как структура объектов динамическая и скрипты генерятся динамически. Править их руками можно и забыть в один прекрасный момент, тем более, что надо проделать дополнительные телодвижения, чтобы выяснить какие временные таблицы надо создавать.
2) Создавать отдельное соединение с базой и создавать таблицы именно там.
Плохо то, что объект, который выполняет транзакцию, понятия не имеет о параметрах соединения. Соединения он получает в качестве параметра и клонировать его не представляется возможным.
Есть ли ещё варианты решения этой проблемы?
Suntechnic (2004-01-27 22:00:00) [21]
>Petr V. Abramov © (27.01.04 19:55)
А проще, приведите проблемный кусок скрипта
Да нет никакого скрипта. Есть транзакция которая выполняется из приложения. Во время транзакции идёт удаление объектов (обычные delete запросы). Иногда возникает необходимость прежде, чем удалить записи, сохранить их во временной таблице, для того чтобы использовать в других SQL запросах на удаление (почему так долго объяснять, если кто-нибудь занимался проблемами проецирования объектной модели в реляционную, тот думаю поймёт). Вопрос состоит в том как и где создавать временные таблицы (об их удалении речь не идёт, т.к. они будут созданы только один раз, а затем только проверяться существуют ли они). Возможные варианты решения и почему они не совсем устраивают приведены в первом посте.
Petr V. Abramov (2004-01-27 19:56:00) [22]
А проще, приведите проблемный кусок скрипта
Petr V. Abramov (2004-01-27 19:55:00) [23]
Suntechnic © (27.01.04 19:43) [4]
Извиняюсь, неправильно понял, че надо.
Тогда встречные вопросы - если идет "удаление объектов", то это DDL, и в рамках одной транзакции насколько drop чего-нибудь не проходят. Что же имелось в виду?
Reindeer Moss Eater (2004-01-27 19:50:00) [24]
Suntechnic ©
Ну тогда гудбай.
Suntechnic (2004-01-27 19:49:00) [25]
>Reindeer Moss Eater ©
Кто здесь писал про дропание/создавание?
Наверное тот, кто DDL команды посылает серверу.
Да нет, скорее тот, кто флейм разводит вместо того, чтобы по делу высказаться.
Reindeer Moss Eater (2004-01-27 19:49:00) [26]
Я задал один вопрос, а в ответ получил... два вопроса :)
А мне запрещено Конституцией задавать вопросы в этом форуме?
Reindeer Moss Eater (2004-01-27 19:46:00) [27]
Кто здесь писал про дропание/создавание?
Наверное тот, кто DDL команды посылает серверу.
Кто здесь говорил про глобальные результаты?
...что необходимо создавать global temporary table для хранения...
Никто не говорил, что кто-то говорил. Я спрашивал, действительно ли промежуточные результаты должны быть глобальны.
Suntechnic (2004-01-27 19:43:00) [28]
Petr V. Abramov © (27.01.04 19:37) [2]
create temporary table < ...... > on commit preserve rows
Работает (не без вероятности ora-600 :) начиная с 8.1.6
Спасибо, но именно о них я и писал. Только верный синтаксис
create globaltemporary table < ...... > on commit preserve [delete] rows
Suntechnic (2004-01-27 19:42:00) [29]
>Reindeer Moss Eater ©
Я задал один вопрос, а в ответ получил... два вопроса :)
Если это результаты только для текущего соединения, то почему не испоьзуются таблицы PLSQL в пакетах?
Да, результаты даже скорее характерны для транзакции, но можешь считать для соединяния.
таблицы PLSQL в пакетах
Это что за звери такие?
Если это промежуточные результаты действительно глобальны, то почему не предусмотреть постоянную структуру
Кто здесь говорил про глобальные результаты?
а не дропать/создавать заново?
Кто здесь писал про дропание/создавание?
Petr V. Abramov (2004-01-27 19:37:00) [30]
create temporary table < ...... > on commit preserve rows
Работает (не без вероятности ora-600 :) начиная с 8.1.6
Reindeer Moss Eater (2004-01-27 19:34:00) [31]
необходимо создавать global temporary table для хранения промежуточных результатов.
Если это результаты только для текущего соединения, то почему не испоьзуются таблицы PLSQL в пакетах?
Если это промежуточные результаты действительно глобальны, то почему не предусмотреть постоянную структуру, а не дропать/создавать заново?
Suntechnic (2004-01-23 13:25:00) [32]
>Nikolay M. © (28.01.04 09:16)[27]
Почему не подходит? Как один из вариантов вполне даже.
Reindeer Moss Eater © (28.01.04 16:31) [26]
На SQL.RU тебе посоветовали первое что пришло в голову - использовать автономные транзакции.
Только это не поможет ни грамма.
Коммит все равно будет, даже если DDL выполнить в автономной транзакции
Тебя это, наверное, удивит, но DLL в автономной транзакции никак не влияет на текущую транзакцию.