Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Проблема при вставке большого количества записей из FB  [new]
WНаталья
Member

Откуда: Мурманск
Сообщений: 68
Имеется БД с овер 15 000 записями в одной таблице (id_студента, фото студента). БД - FireBird.

Нужно таблицу с фото перекопировать в локальную БД (Оракл). Выполняю средствами DELPHI

И вроде как все получается. Но...

при попытках вставки сразу всех записей последовательно я получаю сообщение " Out of memory". Собственно оно и понятно, почему.

1. Как можно вставить все записи? Или поделить количество, допустим на 3, и и вставлять в цикле?
2. Как сделать проверку на дубли? Сейчас поле id_студента, - первичный ключ, но при копировании вставилось несколько сот пустых стотрок, так как видимо, сначала вствляется пустая строка, потом значение.
Если значение уже есть, то возникает исключение "unigue constant", вставка не происходит, но пустая строка остается.
3. Если делить на 3 цикла, то программа после вставки 10 000 завысает. Вероятно, происходят утечки памяти. КАк это проверить избежать?

Вот код вставки
   
FDQuery1.first;
while not (FDQuery1.Eof) do
begin
try

    qGET_PERS_FOTO.Open;
    qGET_PERS_FOTO.Insert;
    qGET_PERS_FOTO.FindField('foto').Assign(FDQuery1.FieldByName('foto'));
    qGET_PERS_FOTO.FindField('pers_id').Assign(FDQuery1.FieldByName('pers_id'));
    qGET_PERS_FOTO.Post;
    FDQuery1.Next;

    Except
     On e: Exception Do
     begin
       if Pos('unique constraint', e.Message)> 0 then
       begin
         FDQuery1.Next;
      end;
     end;
end;
15 фев 21, 15:39    [22281189]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31969

15.02.2021 15:39, WНаталья пишет:
> при попытках вставки сразу всех записей последовательно я получаю сообщение " Out of memory".
> Собственно оно и понятно, почему.

почему?

Posted via ActualForum NNTP Server 1.5

15 фев 21, 15:42    [22281191]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
WНаталья
Как можно вставить все записи
Заменить TFDQuery на TFDCommand
WНаталья
так как видимо, сначала вствляется пустая строка,
Нет
WНаталья
то возникает исключение "unigue constant"
Если такое ограничение есть на базе и если текст ошибки звучит именно так
WНаталья
то программа после вставки 10 000 завысает
Само собой. Вы же так и написали
WНаталья
// Пока не достигли конца датасета, крутим цикл
while not (FDQuery1.Eof) do 
begin
  try
    // Зачем-то в цикле каждый раз пытаемся открыть датасет
    qGET_PERS_FOTO.Open;  
    qGET_PERS_FOTO.Insert;
    // на каждую итерацию цикла делаем поиск полей
    qGET_PERS_FOTO.FindField('foto').Assign(FDQuery1.FieldByName('foto'));
    qGET_PERS_FOTO.FindField('pers_id').Assign(FDQuery1.FieldByName('pers_id'));
    qGET_PERS_FOTO.Post;
    FDQuery1.Next;
  Except
     On e: Exception Do
     begin
       // Если текст сообщения содержит 'unique constraint' (именно в таком написании)
       if Pos('unique constraint', e.Message)> 0 then
       begin
         // то перейти на следующую запись
         FDQuery1.Next;
      end;
      // А если не содержит, то остаться на текущей и повторить вставку
     end;
end;


И покажите DDL таблиц
15 фев 21, 15:59    [22281201]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
WНаталья
при попытках вставки сразу всех записей последовательно я получаю сообщение " Out of memory". Собственно оно и понятно, почему.

Не используй датасет, вот и всё.
15 фев 21, 16:11    [22281209]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
WНаталья
Member

Откуда: Мурманск
Сообщений: 68
_Vasilisk_,
прошу прощения, новичок в этом всем. Пытаюсь разобраться.
Что такое dll таблицы?
15 фев 21, 16:39    [22281234]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
WНаталья
Member

Откуда: Мурманск
Сообщений: 68
_Vasilisk_,
не очень понимаю, как использовать TFDCommand.

Допустим, написала я внутри компонента запрос на выборку всех записей.
А дальше как использовать его при вставке ?
15 фев 21, 16:51    [22281239]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62404
WНаталья> Нужно таблицу с фото перекопировать в локальную БД (Оракл).

А что такое локальная БД?

> Или поделить количество, допустим на 3, и и вставлять в цикле?

Не надо делить на 3. Вставляйте по 1 записи,
потом сделаете коммит для всей пачки.
Для Вашего уровня знаний и разовой задачи этого хватит.

> 2. ... при копировании вставилось несколько сот пустых стотрок,

Удалите их.

> так как видимо, сначала вствляется пустая строка, потом значение.

Нет, Оракл такой фигнёй не страдает.

Posted via ActualForum NNTP Server 1.5

15 фев 21, 17:11    [22281256]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26952
WНаталья
И вроде как все получается. Но...

1. Нужно перейти на query.
2. Вставку делать во временную таблицу, на которой нет никаких триггеров, ограничений и индексов.
3. После заполнения п.2 - вызвать процедуру на сервере (придется её написать), которая сделает остальную работу (проверит и перекинет в нормальную таблицу).
15 фев 21, 17:15    [22281259]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
MaratIsk
Member

Откуда: Almaty, Kazakhstan
Сообщений: 2556
WНаталья,
грузишь всю таблицу в память, а надо использовать unidirectional
15 фев 21, 17:20    [22281261]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4643
Неужели Firebird не линкуется к Oracle?
Если линкуется, то дельфи нафиг не нужен.
15 фев 21, 17:46    [22281277]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62404
Через ODBC/JDBC линкуется, конечно.

Posted via ActualForum NNTP Server 1.5

15 фев 21, 18:14    [22281302]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52445

Гаджимурадов Рустам
Через ODBC/JDBC линкуется, конечно.

Но не работает с блобами. Посмотрите уже топики аффтарши.

Posted via ActualForum NNTP Server 1.5

15 фев 21, 18:48    [22281314]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
WНаталья
Member

Откуда: Мурманск
Сообщений: 68
Dimitry Sibiryakov,

да, не линкуется.

Оракрл воспринимает блоб как лонг раф и режет его до 32к. (если коротко)

Сообщение было отредактировано: 15 фев 21, 19:39
15 фев 21, 19:46    [22281337]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
MaratIsk
Member

Откуда: Almaty, Kazakhstan
Сообщений: 2556
WНаталья,
тебе не знакомо свойство unidirectional ?

Сообщение было отредактировано: 15 фев 21, 19:53
15 фев 21, 19:51    [22281338]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
defecator
Member

Откуда:
Сообщений: 39683
WНаталья
Dimitry Sibiryakov,

да, не линкуется.

Оракрл воспринимает блоб как лонг раф и режет его до 32к. (если коротко)

так это не оракел виноват, а дрова ODBC
15 фев 21, 19:53    [22281341]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
WНаталья
Member

Откуда: Мурманск
Сообщений: 68
MaratIsk,

к сожалению нет, не знакомо
15 фев 21, 19:54    [22281342]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52445

defecator
так это не оракел виноват, а дрова ODBC

Правда? Какой тип данных должен вернуть драйвер чтобы Oracle HS воспринял его как BLOB?
SQL_LONGVARBINARY не канает.

Posted via ActualForum NNTP Server 1.5

15 фев 21, 20:04    [22281345]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
MaratIsk
Member

Откуда: Almaty, Kazakhstan
Сообщений: 2556
WНаталья
MaratIsk,

к сожалению нет, не знакомо


к предыдущему сообщению приаттачил файл

unidirectional - это свойство query создающее однонаправленный набор
указываешь UniDirectional := TRUE; и бежишь по набору, формируя insert для целевой бд
out of memory не будет, потому что такой запрос не буферизует все записи в памяти, а только текущую запись
15 фев 21, 20:08    [22281349]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
defecator
Member

Откуда:
Сообщений: 39683
Dimitry Sibiryakov
defecator
так это не оракел виноват, а дрова ODBC

Правда? Какой тип данных должен вернуть драйвер чтобы Oracle HS воспринял его как BLOB?
SQL_LONGVARBINARY не канает.

а чойта не канает ?
SQL_BINARY тоже побоку ?

Сообщение было отредактировано: 15 фев 21, 20:11
15 фев 21, 20:16    [22281353]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
WНаталья
Member

Откуда: Мурманск
Сообщений: 68
MaratIsk,

не вижу у компонента такого свойства.

Для ADO есть, а для FireDac - нет

К сообщению приложен файл. Размер - 6Kb
15 фев 21, 21:09    [22281376]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
MaratIsk
Member

Откуда: Almaty, Kazakhstan
Сообщений: 2556
WНаталья
MaratIsk,

не вижу у компонента такого свойства.

Для ADO есть, а для FireDac - нет


выбрось FireDac - для столь простой задачи как перекачка данных достаточно
IBDatabase, IBCustomDataSet, IBQuery
15 фев 21, 21:13    [22281378]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
WНаталья
Member

Откуда: Мурманск
Сообщений: 68
MaratIsk,
IBDatabase в моем случае не вариант. при коннекте к БД получаю ошибку типа "структура БД не поддерживается".
15 фев 21, 21:29    [22281381]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
MaratIsk
Member

Откуда: Almaty, Kazakhstan
Сообщений: 2556
WНаталья,
вариант-вариант :)
какая версия у сервера ФБ ?
15 фев 21, 21:36    [22281383]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
WНаталья
Member

Откуда: Мурманск
Сообщений: 68
MaratIsk,


3.0
15 фев 21, 21:40    [22281384]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при вставке большого количества записей из FB  [new]
MaratIsk
Member

Откуда: Almaty, Kazakhstan
Сообщений: 2556
WНаталья,
значит надо подключить fbclient.dll 3-ей версии только и всего
т.е. положить рядом с приложением
15 фев 21, 21:44    [22281386]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить