![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
временная база данных [D6, IB6.x]
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, то всегда есть возможность написать ХП, или уж временную таблицу в памяти сделать...
И думаю, что это будет быстрее вр.тбл.