Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизOracle и транзакции. Найти похожие ветки
← →
Suntechnic (2004-01-27 19:23) [0]Проблема в следующем. Есть некая транзакция в рамках которой происходит удаление объектов. Иногда во время удаления объектов выясняется, что необходимо создавать global temporary table для хранения промежуточных результатов. Особенность работы Oracle заключается в том, что перед выполнением DDL команды Oracle commit текущую транзакцию. И если какое-нибудь из поседующих запросов не проходит, теряется целостность данных.
Существующие решение:
1) Создавать временные таблицы в скрипте по созданию базы данных.
Не очень хочется это делать так как структура объектов динамическая и скрипты генерятся динамически. Править их руками можно и забыть в один прекрасный момент, тем более, что надо проделать дополнительные телодвижения, чтобы выяснить какие временные таблицы надо создавать.
2) Создавать отдельное соединение с базой и создавать таблицы именно там.
Плохо то, что объект, который выполняет транзакцию, понятия не имеет о параметрах соединения. Соединения он получает в качестве параметра и клонировать его не представляется возможным.
Есть ли ещё варианты решения этой проблемы?
← →
Reindeer Moss Eater (2004-01-27 19:34) [1]необходимо создавать global temporary table для хранения промежуточных результатов.
Если это результаты только для текущего соединения, то почему не испоьзуются таблицы PLSQL в пакетах?
Если это промежуточные результаты действительно глобальны, то почему не предусмотреть постоянную структуру, а не дропать/создавать заново?
← →
Petr V. Abramov (2004-01-27 19:37) [2]create temporary table < ...... > on commit preserve rows
Работает (не без вероятности ora-600 :) начиная с 8.1.6
← →
Suntechnic (2004-01-27 19:42) [3]>Reindeer Moss Eater ©
Я задал один вопрос, а в ответ получил... два вопроса :)
Если это результаты только для текущего соединения, то почему не испоьзуются таблицы PLSQL в пакетах?
Да, результаты даже скорее характерны для транзакции, но можешь считать для соединяния.
таблицы PLSQL в пакетах
Это что за звери такие?
Если это промежуточные результаты действительно глобальны, то почему не предусмотреть постоянную структуру
Кто здесь говорил про глобальные результаты?
а не дропать/создавать заново?
Кто здесь писал про дропание/создавание?
← →
Suntechnic (2004-01-27 19:43) [4]Petr V. Abramov © (27.01.04 19:37) [2]
create temporary table < ...... > on commit preserve rows
Работает (не без вероятности ora-600 :) начиная с 8.1.6
Спасибо, но именно о них я и писал. Только верный синтаксис
create global temporary table < ...... > on commit preserve [delete] rows
← →
Reindeer Moss Eater (2004-01-27 19:46) [5]Кто здесь писал про дропание/создавание?
Наверное тот, кто DDL команды посылает серверу.
Кто здесь говорил про глобальные результаты?
...что необходимо создавать global temporary table для хранения...
Никто не говорил, что кто-то говорил. Я спрашивал, действительно ли промежуточные результаты должны быть глобальны.
← →
Reindeer Moss Eater (2004-01-27 19:49) [6]Я задал один вопрос, а в ответ получил... два вопроса :)
А мне запрещено Конституцией задавать вопросы в этом форуме?
← →
Suntechnic (2004-01-27 19:49) [7]>Reindeer Moss Eater ©
Кто здесь писал про дропание/создавание?
Наверное тот, кто DDL команды посылает серверу.
Да нет, скорее тот, кто флейм разводит вместо того, чтобы по делу высказаться.
← →
Reindeer Moss Eater (2004-01-27 19:50) [8]Suntechnic ©
Ну тогда гудбай.
← →
Petr V. Abramov (2004-01-27 19:55) [9]Suntechnic © (27.01.04 19:43) [4]
Извиняюсь, неправильно понял, че надо.
Тогда встречные вопросы - если идет "удаление объектов", то это DDL, и в рамках одной транзакции насколько drop чего-нибудь не проходят. Что же имелось в виду?
← →
Petr V. Abramov (2004-01-27 19:56) [10]А проще, приведите проблемный кусок скрипта
← →
Suntechnic (2004-01-27 22:00) [11]>Petr V. Abramov © (27.01.04 19:55)
А проще, приведите проблемный кусок скрипта
Да нет никакого скрипта. Есть транзакция которая выполняется из приложения. Во время транзакции идёт удаление объектов (обычные delete запросы). Иногда возникает необходимость прежде, чем удалить записи, сохранить их во временной таблице, для того чтобы использовать в других SQL запросах на удаление (почему так долго объяснять, если кто-нибудь занимался проблемами проецирования объектной модели в реляционную, тот думаю поймёт). Вопрос состоит в том как и где создавать временные таблицы (об их удалении речь не идёт, т.к. они будут созданы только один раз, а затем только проверяться существуют ли они). Возможные варианты решения и почему они не совсем устраивают приведены в первом посте.
← →
Reindeer Moss Eater (2004-01-28 08:47) [12]Во время транзакции идёт удаление объектов (обычные delete запросы).
Зашибись постановка вопроса.
Удаление объектов и обычные delete запросы - вещи-то совсем разные.
И при всем при этом еще нервная реакция на уточняющие вопросы.
← →
Sergey13 (2004-01-28 08:52) [13]2Suntechnic © (27.01.04 22:00) [11]
Ты сам всех запутал, а потом обижаешься.
>Особенность работы Oracle заключается в том, что перед выполнением DDL команды Oracle commit текущую транзакцию
как сочетается с
>они будут созданы только один раз
Ну и в какой текущей транзакции ты их создаешь?
← →
Nikolay M. (2004-01-28 09:16) [14]В одной известной в своих кругах бухгалтерской программе (MS SQL/SYBASE, правда) решили обойтись без временных таблиц (в MS SQL 6.5 имеются глюки с использованием временных таблиц в транзакциях). Делается очень тупо: промежуточные таблицы не создаются/удаляются, используются обычные таблицы, но информация в них лежит своя для каждой сессии (в MS SQL/SYBASE это @@SPID, аналога в Оракле не знаю). Соответственно прежде чем что-то писать в такие таблицы делается DELETE FROM result_temp_table WHERE spid = @@SPID. Когда данные в таблицах больше не нужны, данные тоже грохаются во избежание накопление мусора. В принципе, тоже вариант.
← →
Reindeer Moss Eater (2004-01-28 09:21) [15]Не нужны временные таблицы в Оракле в этом конкретном случае.
Вообще.
Достаточно использовать пакеты и структурные типы данных PLSQL.
Все переменные пакетов сохраняют свое состояние на протяжении всей сесии пользователя.
А уж что там конкретно использовать - ассоциативные массивы, PLSLQ таблицы или записи - зависит от версии сервера и структуры промежуточных данных данных.
← →
Sergey13 (2004-01-28 11:54) [16]2Reindeer Moss Eater © (28.01.04 09:21) [15]
А чем принципиально PL/SQL таблицы лучше темповых в данном случае? Особенно если данных в них может быть достаточно много и обращаться к данным надо на клиенте.
← →
Reindeer Moss Eater (2004-01-28 12:20) [17]Тем, что их создание - не DDL стэйтмент со всеми вытекающими (коммит, который у автора может закоммитить то, что не надо было коммитить)
в них может быть достаточно много и обращаться к данным надо на клиенте.
Не думаю, что временные данные (которые используются для удаления строк из каких-то других таблиц, если я правильно понял проблему автора) нужны на клиенте
← →
Suntechnic (2004-01-28 15:47) [18]Ну народ вы даёте. Задал вопрос в той же формулировке на SQL.ru получил ответ в течении 15 мин. Здесь кто во что горазд.
Sergey13 © (28.01.04 08:52) [13]
>Особенность работы Oracle заключается в том, что перед выполнением DDL команды Oracle commit текущую транзакцию
как сочетается с
>они будут созданы только один раз
Ну и в какой текущей транзакции ты их создаешь?
Да какая, извините, нафиг разница в какой? В первой, в которой они потребуются. Конечно, этой проблемы уже не будет во второй раз, но всё ещё существует вероятность того, что потеряем целостность данных в первый раз.
>Reindeer Moss Eater ©
Удаление объектов и обычные delete запросы - вещи-то совсем разные.
И при всем при этом еще нервная реакция на уточняющие вопросы.
Reindeer Moss Eater © (28.01.04 09:21) [15]
Не нужны временные таблицы в Оракле в этом конкретном случае.
Вообще.
Достаточно использовать пакеты и структурные типы данных PLSQL.
Все переменные пакетов сохраняют свое состояние на протяжении всей сесии пользователя.
А уж что там конкретно использовать - ассоциативные массивы, PLSLQ таблицы или записи - зависит от версии сервера и структуры промежуточных данных данных.
Существует множество подходов, но в данном конкретном случае нельзя переносить логику на сервер, потому как идёт разработка под несколько target database (это ограничивает применение PL/SQL). Временные таблицы, как явление, присутствуют как в Oracle так и MS MSQL, что и необходимо в данном конкретном случае.
Вообще акцент ответов больше склоняется к теме "как я бы постороил логику", вместо "как решить данную конкретную проблему".
← →
Petr V. Abramov (2004-01-28 15:47) [19]структура:
create table T1
(
ID NUMBER not null,
SOME_TEXT VARCHAR2(8)
)
tablespace HLAM
create table T2 tablespace HLAM as select * from T1
скрипт:
declare
type int_table_t is table of integer;
mem_tmp int_table_t := int_table_t();
begin
delete from T1
where ID < 100
returning id bulk collect into mem_tmp;
if SQL%found then
forall i in mem_tmp.first .. mem_tmp.last
delete from T2 where ID = mem_tmp(i);
end if;
end;
Оно?
← →
Suntechnic (2004-01-28 15:58) [20]>Petr V. Abramov ©
Не оно :)
Я не могу исплоьзовать PL/SQL в данном конкретном случае. Логика работы с СУБД реализуется на клиенте.
← →
Reindeer Moss Eater (2004-01-28 16:04) [21]Я не могу исплоьзовать PL/SQL в данном конкретном случае. Логика работы с СУБД реализуется на клиенте.
Замечательно. Не хотим делать что-то на сервере.
Что тогда мешает создать на клиенте экземпляр TClientDataSet, заполнить его временными данными, и выполнять дальнейшие запросы на основе такой временной таблицы на клиенте?
← →
Suntechnic (2004-01-28 16:07) [22]>Reindeer Moss Eater ©
Сменил бы ты свою пластинку. Я ж просил высказываться не по логике, а по сути проблемы. Если окажется что решение проблемы затруднено, или получается некрасивым, вот тогда я спрошу про логику, а пока извини.
P.S. Разработка вообще не на Delphi идёт. Так что про TClientDataSet забудь.
← →
Reindeer Moss Eater (2004-01-28 16:15) [23]Suntechnic ©
Меня мало волнует что ты там просил.
Я вижу что ты спросил, и высказываюсь так, как считаю нужным.
P.S. Разработка вообще не на Delphi идёт. Так что про TClientDataSet забудь.
А понять, что тебе советуют временную таблицу иметь на клиенте, абстрагировавшись от конкретно указанного класса сил не хватает?
← →
Suntechnic (2004-01-28 16:20) [24]>Reindeer Moss Eater ©
Слушай, создай свою ветку и тренеруйся там в своём словоблудии. У меня нет ни сил ни желания тратить на это время здесь.
← →
Reindeer Moss Eater (2004-01-28 16:21) [25]Нет сил и желания - не трать.
← →
Reindeer Moss Eater (2004-01-28 16:31) [26]Ну народ вы даёте. Задал вопрос в той же формулировке на SQL.ru получил ответ в течении 15 мин. Здесь кто во что горазд.
На SQL.RU тебе посоветовали первое что пришло в голову - использовать автономные транзакции.
Только это не поможет ни грамма.
Коммит все равно будет, даже если DDL выполнить в автономной транзакции.
← →
Nikolay M. (2004-01-28 17:10) [27]
> Существует множество подходов, но в данном конкретном случае
> нельзя переносить логику на сервер, потому как идёт разработка
> под несколько target database (это ограничивает применение
> PL/SQL). Временные таблицы, как явление, присутствуют как
> в Oracle так и MS MSQL, что и необходимо в данном конкретном
> случае.
Почему тогда [14] не подходит?
← →
Suntechnic (2004-01-23 13:25) [28]>Nikolay M. © (28.01.04 09:16)[27]
Почему не подходит? Как один из вариантов вполне даже.
Reindeer Moss Eater © (28.01.04 16:31) [26]
На SQL.RU тебе посоветовали первое что пришло в голову - использовать автономные транзакции.
Только это не поможет ни грамма.
Коммит все равно будет, даже если DDL выполнить в автономной транзакции
Тебя это, наверное, удивит, но DLL в автономной транзакции никак не влияет на текущую транзакцию.
← →
Reindeer Moss Eater (2004-01-28 21:42) [29]Меня удивляет не это.
но в данном конкретном случае нельзя переносить логику на сервер, потому как идёт разработка под несколько target database (это ограничивает применение PL/SQL).
Автономные транзакции это и есть PL/SQL в чистом виде.
Фича Оракла.
← →
Suntechnic (2004-01-28 21:52) [30]>Reindeer Moss Eater ©
У меня нет желания и возможности рисовать тебе всю картинку в целом. Если до тебя не доходит, а по существу вопроса сказать нечего, то лучше просто промолчи, будь добр, вместо того, чтобы выдёргивать фразы из контекста и удивляться.
← →
Reindeer Moss Eater (2004-01-29 00:23) [31]У меня нет желания и возможности рисовать тебе всю картинку в целом.
Еще раз: Тебя кто-нибудь просил рисовать мне картины?
Еще раз: Я высказываюсь в форуме по топику. Все.
Если не доходит, могу повторить еще раз.
← →
Suntechnic (2004-01-29 01:21) [32]Прошу считать обсуждение в этой ветке закрытой. Всем спсасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.009 c