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

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

временная база данных [D6, IB6.x]


Страницы:   1 2

AVP_opck ©   (2004-01-13 08:57:00) 

во время выполнения программы нужно сохранять данные во временную базу данных. так чтобы с другой машины этапрограмма сохраняла временные данные в другую базу.
как в IB сделать эту временную базу?


Sandman25   (2004-01-13 13:34:00) [1]

[38] Johnmen © (13.01.04 13:15)

Напоминаю, что все таблицы закрыты даже на select. Склейка View - очень медленно работает. Динамического SQL во многих СУБД нет, а если и есть, то он гораздо медленнее, чем "препарированная" ХП.
Если выбрать много товаров (почти все, например), то можно встретиться с ограничением на длину запроса (в MySQL что-то около 8000 символов).
Ладно, я понял "упрямство" оппонентов. Прекращаю спорить :)


MV   (2004-01-13 13:20:00) [2]

InterBase НЕ ПРЕДНАЗНАЧЕН для интеенсивной работы по изменению метаданных. (например, структуру одну таблички можно менять не более 255 раз до бэкап-ресторе). ПРоблема много раз обсуждалась уже давно решена: либо используй "этот ужасный динамический SQL", либо создай одну табличку на всех с идентификатором текущего подключения. Я обычто использую первый вариант. До InterBase использовал временные таблицы. Думаю, это было из-за слабого знания возможностей SQL.


Johnmen   (2004-01-13 13:15:00) [3]

>Sandman25 © (13.01.04 13:04)

Ну по первому можно вообще просто запросом. Динамически создаваемым.


Johnmen   (2004-01-13 13:09:00) [4]

>Desdechado © (13.01.04 12:59)

Просто по второй части твоего поста не берусь судить об эффективности применения вр.тбл. М.б. было бы достаточно длинной varchar для складывания рёбер...


Sandman25   (2004-01-13 13:04:00) [5]

[32] Johnmen © (13.01.04 12:53)

Достаточно написать "правильную" ХП.

Можно поподробнее? Какова хранимая процедура для первого случая? Можно без реализации, только идею.

Я, конечно, не спорю, что можно и без в.т. обойтись, но при таком подходе можно работать с сервером приложений и текстовыми файлами. Ведь тоже возможно, причем получится без триггеров, ХП, view, grant/revoke :)


Vemer   (2004-01-13 13:03:00) [6]

To Sandman25
Сорри за ошибку в нике в предыдущем сообщении..


Vemer   (2004-01-13 13:02:00) [7]

To Sandman.

Пример 1 из (23) замечательно реализуеться UNION... а для выбранные можно отлично выбирать ..Where Select_Num > 0 (Select_Num - поле).


Desdechado   (2004-01-13 12:59:00) [8]

во второй части моего поста речь идет об обработке внутри ХП, ибо на клиенте такое делать мне кажется лишним


Johnmen   (2004-01-13 12:53:00) [9]

>Sandman25 © (13.01.04 12:24)

Если правильно понял, то для всего этого не нужны в.т.
Достаточно написать "правильную" ХП.
Вот с первой частью замечания Desdechado © (13.01.04 12:01) согласен. (По второй ничего не могу сказать...)


Sandman25   (2004-01-13 12:24:00) [10]

[29] Johnmen © (13.01.04 11:52)

Расширенные примеры

1.На клиенте выполняю
CREATE TEMP TABLE tmp_tovars(id INT);
Для всех записей, отмеченных пользователем в гриде, выполняю
INSERT INTO tmp_tovars(id) VALUES(:id);
Вызываю хранимую процедуру.
Она считает сумму по выбранным товарам:
SELECT SUM(A.price*A.amount)
FROM ostatki A,
tmp_tovars B
WHERE A.tovar_id = B.id

2. Отчет, считающие остатки на начало периода, расход, приход, и остатки на конец периода.

CREATE TEMP TABLE tmp_begin(tovar_id INT, amount INT);
CREATE TEMP TABLE tmp_end(tovar_id INT, amount INT);
CREATE TEMP TABLE tmp_prihod(tovar_id INT, amount INT);
CREATE TEMP TABLE tmp_rashod(tovar_id INT, amount INT);

INSERT INTO tmp_begin
SELECT ...;
INSERT INTO tmp_prihod
SELECT ...;
INSERT INTO tmp_rashod
SELECT ...;
INSERT INTO tmp_end
SELECT ...
FROM tmp_begin
UNION
SELECT ..
FROM tmp_prihod;
UPDATE tmp_end
SET ...
WHERE EXISTS (SELECT ... FROM tmp_rashod ...);
...
Получаем 4 таблицы для 4 гридов в результате 1 хранимой процедуры, причем остатки на конец периода посчитали по таблицам с движением, что может быть гораздо быстрее, чем прямой расчет по постоянным таблицам.


Desdechado   (2004-01-13 12:01:00) [11]

по сабжу:
Я временные таблицы не использую, поскольку можно в ХП сделать FOR SELECT любой сложности и вложенности, чтобы получить аналог этой самой временной таблицы.

А вот таблицы фиксированной структуры для временного хранения данных - приходится. Пример: рекурсивный разбор графа, хранимого списком ребер в БД. Чтобы не зациклиться, приходится уже пройденные ребра где-то складывать (в IB нет глобальных переменных, тем более массивов) для проверки. По завершению процедуры распутывания - очистка. Естественно, для каждого юзера свой ID в такой таблице.


Johnmen   (2004-01-13 11:52:00) [12]

>Zz_ (13.01.04 11:10) [24]
>советую решить пару упражнений с номерами от 90 и выше на sql.ipps.ru

Что-то не получается выбрать...:(

>Sandman25 © (13.01.04 11:09)

1. Не понял... ( размягчение мозга ? ) :)
2. Опять не понял... ( точно - оно :( , а так хотелось понять...)
:-)))


Sergey13   (2004-01-13 11:33:00) [13]

2V2nmen © (13.01.04 11:24) [26]
Сори. Мысленно сложил твой пост [12] с Vemer © (13.01.04 10:38) [17] 8-)


Andriano   (2004-01-13 11:29:00) [14]

Что тут можно писать? Автору нужно экспорт, а тут сотни способов.

Пора уже ветку создать "на вкус и цвет..."


Johnmen   (2004-01-13 11:24:00) [15]

>Sergey13 © (13.01.04 11:14)
>Про размягчение могов ...

Ты меня с кем-то спутал...


Sergey13   (2004-01-13 11:14:00) [16]

2Johnmen © (13.01.04 11:02) [22]
>Просто все высказывают свою т.з.
Про размягчение могов непродвинутых программистов? Скажем так, не очень то корректное изложение своей Т.З.

ЗЫ:А вообще, ветка, ИМХО, здорово напрашивается на перемещение в "Потрепаться".


Zz_   (2004-01-13 11:10:00) [17]

>>Johnmen ©

Чтобы понять, зачем нужны временные таблицы,
и как они позволяют решать задачи не через заднее место,
советую решить пару упражнений с номерами от 90 и выше
на sql.ipps.ru


Sandman25   (2004-01-13 11:09:00) [18]

[21] Johnmen © (13.01.04 10:59)

Я вижу, ты не совсем понял. Вот несколько примеров использования временных таблиц.

1. Пользователь выбирает что-нибудь (товары, молы, участки и т.д.), для которых хочет получить отчет. В хранимой процедуре стоит
select данные
from таблицы_данных t1,
временная_таблица_выбранных_участков t2,
временная_таблица_выбранных_молов t3,
временная_таблица_выбранных_товаров t4
where t1.участок = t2.id
and t1.мол = t3.id
and t1.товар = t4.id
При этом не важно, сколько участков, товаров, молов выбрал пользователь (0-бесконечность), он получит отчет по выбранным данным. Причем отчет может быть как суммарным, так и в разрезе того, что он выбрал. Как это сделать без временных таблиц? Напоминаю, что таблицы закрыты на select, а при склеивании нескольких view скорость падает в десятки раз.

2. Запускается ХП расчета данных для отчета. В отчете получается 8 таблиц результатов, данные из которых потом выводятся в клиенте. Все таблицы являются временными. Как получить результаты без временных таблиц, не запуская 8 хранимых процедур? Про ограничение View я уже писал. Кстати, в этой хранимой процедуре некоторые таблицы строятся с помощью использования других временных таблиц.

Насчет моей впечатлительности ты прав, но мне интересно, а как бы ты отреагировал, если бы прочитал: "Я не использую хранимые процедуры. Хоть их и ввели в последней версии Interbase, но мне они пока не нужны" :)

PS. Если примеров с таблицами мало, могу еще вспомнить :)


Johnmen   (2004-01-13 11:02:00) [19]

>Sergey13 © (13.01.04 10:56)

Конечно. Никто не предосуждает. Просто все высказывают свою т.з.


Johnmen   (2004-01-13 10:59:00) [20]

>Sandman25 © (13.01.04 10:50)

Шокинг ? :) Это от чрезмерной впечатлительности...

>...???

Не понял...

А если уж надо что-то действительно черезж...ое, типа журнала операций etc, то всегда есть возможность написать ХП, или уж временную таблицу в памяти сделать...
И думаю, что это будет быстрее вр.тбл.


Страницы:   1 2

Наверх

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