![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIBQuery и Out of Memory (help) [D6, IB6.x]
A_Gura © (2002-12-16 06:27:00)Люди!!!! В чем проблема???
Использую IBX TIBQuery. Из файла читаю запись, проверяю ее наличие в БД (запрос на выборку), если запись отсутствует - вставляю ее в БД (insert).
Записей много!!!
Короче при выполнении запроса на выборку большое кол-во раз (более 2000) вываливается ошибка Out of Memory. Сразу добавлю: я сам память не выделяю (т.е. это не моя ошибка)...
A_Gura (2002-12-16 09:24:00) [21]Я уже сказал, что хранимые процедуры не покатят (см. пред. ответы)...
Отгрузка базы у меня хранится в XML-документе, в этом же документе описана структура (список таблиц, поля в них, с указанием того, какие ключевые, а какие нет). Последовательно читаю записи. Для каждой формирую запрос на выборку (т.е. запрос с параметрами, где параметры содержат значения ключевых полей).
Далее, если запрос возвращает запись, то переходим к следующей, иначе формируем запрос на вставку новой записи, выполняем его, и переходим к следующей... Повторюсь: записей много - несколько тысяч.
Sergey Masloff (2002-12-16 09:09:00) [22]Напиши поподробнее что и как ты там вставляешь.
Кстати, вот пример процедуры для IB которая делает Insert или Update в звыисимости от наличия записи
---------------------------------------------------------
CREATE PROCEDURE INSERT_OR_UPDATE_MY_TABLE (
P_ID INTEGER,
P_FIELD1 NUMERIC(15,4),
P_FIELD2 VARCHAR(10),
......
P_REMARK VARCHAR(255))
AS
DECLARE VARIABLE V_K INTEGER;
begin
V_K = NULL;
FOR SELECT ISN FROM MY_TABLE
WHERE ID=:P_ID
INTO :V_K
AS CURSOR TMPCURSOR
DO
UPDATE MY_TABLE M
SET
ID = :P_ID,
FIELD1 = :P_FIELD1,
FIELD2 = :P_FIELD2,
...........
WHERE CURRENT OF TMPCURSOR;
IF (V_K IS NULL) THEN
INSERT INTO MY_TABLE(ID,
FIELD1,
FIELD2,
...
)
VALUES(:P_ID,
:P_FIELD1,
:P_FIELD2,
....
);
end
------------------------------------------------------
A_Gura (2002-12-16 09:04:00) [23]Хранимая процедура не покатит... У меня выгрузка БД в XML (перемещается по области)... Таблица в базе не одна, а на каждую хранимую процедуру делать сам понимаешь...
А насчет моего вопроса: добавил строчкуIBQuery.Params.Clear;
стало больше записей съедать... Не знаю что и делать, може т вообще компонент динамический создавать...
Andriano (2002-12-16 07:47:00) [24]Ты по ним по всем пробегаешь, для того чтобы найти?
Почему ошибка не знаю, но можно сделать проще.
Сделай хранимую проц. Ей передавай в качестве параметров, поля новой записи, а она, проверив наличие такой записи, добавит или игнорирует её.
Определять количество записей нужно select count(Уникальное_Значение) from Таблица_1, т.е. ещё одна процедура.