Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Oracle и транзакции.


Страницы:   1 2

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 запросы - вещи-то совсем разные.
И при всем при этом еще нервная реакция на уточняющие вопросы.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо