![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Oracle и транзакции.
Suntechnic © (2004-01-27 19:23:00)
Проблема в следующем. Есть некая транзакция в рамках которой происходит удаление объектов. Иногда во время удаления объектов выясняется, что необходимо создавать global temporary table для хранения промежуточных результатов. Особенность работы Oracle заключается в том, что перед выполнением DDL команды Oracle commit текущую транзакцию. И если какое-нибудь из поседующих запросов не проходит, теряется целостность данных.
Существующие решение:
1) Создавать временные таблицы в скрипте по созданию базы данных.
Не очень хочется это делать так как структура объектов динамическая и скрипты генерятся динамически. Править их руками можно и забыть в один прекрасный момент, тем более, что надо проделать дополнительные телодвижения, чтобы выяснить какие временные таблицы надо создавать.
2) Создавать отдельное соединение с базой и создавать таблицы именно там.
Плохо то, что объект, который выполняет транзакцию, понятия не имеет о параметрах соединения. Соединения он получает в качестве параметра и клонировать его не представляется возможным.
Есть ли ещё варианты решения этой проблемы?
Suntechnic (2004-01-29 01:21:00) [1]
Прошу считать обсуждение в этой ветке закрытой. Всем спсасибо.
Reindeer Moss Eater (2004-01-29 00:23:00) [2]
У меня нет желания и возможности рисовать тебе всю картинку в целом.
Еще раз: Тебя кто-нибудь просил рисовать мне картины?
Еще раз: Я высказываюсь в форуме по топику. Все.
Если не доходит, могу повторить еще раз.
Suntechnic (2004-01-28 21:52:00) [3]
>Reindeer Moss Eater ©
У меня нет желания и возможности рисовать тебе всю картинку в целом. Если до тебя не доходит, а по существу вопроса сказать нечего, то лучше просто промолчи, будь добр, вместо того, чтобы выдёргивать фразы из контекста и удивляться.
Reindeer Moss Eater (2004-01-28 21:42:00) [4]
Меня удивляет не это.
но в данном конкретном случае нельзя переносить логику на сервер, потому как идёт разработка под несколько target database(это ограничивает применение PL/SQL).
Автономные транзакции это и есть PL/SQL в чистом виде.
Фича Оракла.
Nikolay M. (2004-01-28 17:10:00) [5]
> Существует множество подходов, но в данном конкретном случае
> нельзя переносить логику на сервер, потому как идёт разработка
> под несколько target database (это ограничивает применение
> PL/SQL). Временные таблицы, как явление, присутствуют как
> в Oracle так и MS MSQL, что и необходимо в данном конкретном
> случае.
Почему тогда [14] не подходит?
Reindeer Moss Eater (2004-01-28 16:31:00) [6]
Ну народ вы даёте. Задал вопрос в той же формулировке на SQL.ru получил ответ в течении 15 мин. Здесь кто во что горазд.
На SQL.RU тебе посоветовали первое что пришло в голову - использовать автономные транзакции.
Только это не поможет ни грамма.
Коммит все равно будет, даже если DDL выполнить в автономной транзакции.
Reindeer Moss Eater (2004-01-28 16:21:00) [7]
Нет сил и желания - не трать.
Suntechnic (2004-01-28 16:20:00) [8]
>Reindeer Moss Eater ©
Слушай, создай свою ветку и тренеруйся там в своём словоблудии. У меня нет ни сил ни желания тратить на это время здесь.
Reindeer Moss Eater (2004-01-28 16:15:00) [9]
Suntechnic ©
Меня мало волнует что ты там просил.
Я вижу что ты спросил, и высказываюсь так, как считаю нужным.
P.S. Разработка вообще не на Delphi идёт. Так что про TClientDataSet забудь.
А понять, что тебе советуют временную таблицу иметь на клиенте, абстрагировавшись от конкретно указанного класса сил не хватает?
Suntechnic (2004-01-28 16:07:00) [10]
>Reindeer Moss Eater ©
Сменил бы ты свою пластинку. Я ж просил высказываться не по логике, а по сути проблемы. Если окажется что решение проблемы затруднено, или получается некрасивым, вот тогда я спрошу про логику, а пока извини.
P.S. Разработка вообще не на Delphi идёт. Так что про TClientDataSet забудь.
Reindeer Moss Eater (2004-01-28 16:04:00) [11]
Я не могу исплоьзовать PL/SQL в данном конкретном случае. Логика работы с СУБД реализуется на клиенте.
Замечательно. Не хотим делать что-то на сервере.
Что тогда мешает создать на клиенте экземпляр TClientDataSet, заполнить его временными данными, и выполнять дальнейшие запросы на основе такой временной таблицы на клиенте?
Suntechnic (2004-01-28 15:58:00) [12]
>Petr V. Abramov ©
Не оно :)
Я не могу исплоьзовать PL/SQL в данном конкретном случае. Логика работы с СУБД реализуется на клиенте.
Petr V. Abramov (2004-01-28 15:47:00) [13]
структура:
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:47:00) [14]
Ну народ вы даёте. Задал вопрос в той же формулировке на 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, что и необходимо в данном конкретном случае.
Вообще акцент ответов больше склоняется к теме "как я бы постороил логику", вместо "как решить данную конкретную проблему".
Reindeer Moss Eater (2004-01-28 12:20:00) [15]
Тем, что их создание - не DDL стэйтмент со всеми вытекающими (коммит, который у автора может закоммитить то, что не надо было коммитить)
в них может быть достаточно много и обращаться к данным надо на клиенте.
Не думаю, что временные данные (которые используются для удаления строк из каких-то других таблиц, если я правильно понял проблему автора) нужны на клиенте
Sergey13 (2004-01-28 11:54:00) [16]
2Reindeer Moss Eater © (28.01.04 09:21) [15]
А чем принципиальноPL/SQL таблицы лучше темповых в данном случае? Особенно если данных в них может быть достаточно много и обращаться к данным надо на клиенте.
Reindeer Moss Eater (2004-01-28 09:21:00) [17]
Не нужны временные таблицы в Оракле в этом конкретном случае.
Вообще.
Достаточно использовать пакеты и структурные типы данных PLSQL.
Все переменные пакетов сохраняют свое состояние на протяжении всей сесии пользователя.
А уж что там конкретно использовать - ассоциативные массивы, PLSLQ таблицы или записи - зависит от версии сервера и структуры промежуточных данных данных.
Nikolay M. (2004-01-28 09:16:00) [18]
В одной известной в своих кругах бухгалтерской программе (MS SQL/SYBASE, правда) решили обойтись без временных таблиц (в MS SQL 6.5 имеются глюки с использованием временных таблиц в транзакциях). Делается очень тупо: промежуточные таблицы не создаются/удаляются, используются обычные таблицы, но информация в них лежит своя для каждой сессии (в MS SQL/SYBASE это @@SPID, аналога в Оракле не знаю). Соответственно прежде чем что-то писать в такие таблицы делается DELETE FROM result_temp_table WHERE spid = @@SPID. Когда данные в таблицах больше не нужны, данные тоже грохаются во избежание накопление мусора. В принципе, тоже вариант.
Sergey13 (2004-01-28 08:52:00) [19]
2Suntechnic © (27.01.04 22:00) [11]
Ты сам всех запутал, а потом обижаешься.
>Особенность работы Oracle заключается в том, что перед выполнением DDL команды Oracle commit текущую транзакцию
как сочетается с
>они будут созданы только один раз
Ну и в какой текущей транзакцииты их создаешь?
Reindeer Moss Eater (2004-01-28 08:47:00) [20]
Во время транзакции идёт удаление объектов (обычные delete запросы).
Зашибись постановка вопроса.
Удаление объектов и обычные delete запросы - вещи-то совсем разные.
И при всем при этом еще нервная реакция на уточняющие вопросы.