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

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

Копирование данных из вьюхи в оракле в таблицу в Access [D7, Access]


alsov ©   (2005-09-11 15:04:00) 

Приветствую, Мастера

Есть следующая задача: Перенос информации из оракла в аксес и поддержание таблицы аксеса в актуальном состоянии(обновлять скажем каждые 5 минут).

Написал процедурку, которая выбирает из оракла данные, удаляет табличку в аксессе, создает её (мне показалось что связка дропнуть - создать работает быстрее делита). Далее используя кверики переношу циклом инфу.

Не устраивает скорость работы. Очень долго отрабатывают инсерты.
Сначала думал что это аксес медленно добавляет данный, ан нет. В MSSQL Data TransformationService с этой копированием данных справляется значительно быстрее.

Подскажите, может можно как либо ускорить выполнение инсертов?

Вот код процедуры


rocedure TfrmMain.RefreshPlaceParam();
begin
// Выбираю из вьюхи
 qryOra.SQL.Clear;
 qryOra.SQL.Add('select * from st3d.place_parameter_v');
 qryora.Open;

 PrintDebag(datetimetostr(now) + ':select ora');

 try
   qryAccess.SQL.Clear;
   qryAccess.SQL.Add('drop table place_parameter_v');
   qryAccess.ExecSQL;

   PrintDebag(datetimetostr(now) + ':drop table place_parameter_v');
 except
   on e:Exception do PrintDebag(datetimetostr(now) + ':' + e.Message);
 end;

 qryAccess.SQL.Clear;
 qryAccess.SQL.Add('CREATE TABLE PLACE_PARAMETER_V (PLACE_ID DOUBLE NOT NULL, EXPLICATION_NAME VARCHAR (127) NULL, PLACE_NUMBER VARCHAR (64) NULL, PLACE_NAME VARCHAR (127) NULL, WORKERS_COUNT DOUBLE NOT NULL, REFRESH_DATETIME DATETIME NOT NULL)');
 qryAccess.ExecSQL;

 PrintDebag(datetimetostr(now) + ':create table place_parameter_v');

 qryAccess.SQL.Clear;
 qryAccess.SQL.Add('insert into place_parameter_v (place_id, explication_name, place_number, place_name, workers_count, refresh_datetime) values (:place_id, :explication_name, :place_number, :place_name, :workers_count, :refresh_datetime)');

 while not qryOra.eof do
 begin
   qryAccess.Parameters.ParamByName('place_id').Value := qryOra.FieldByName('place_id').Value;
   qryAccess.Parameters.ParamByName('explication_name').Value := qryOra.FieldByName('explication_name').Value;
   qryAccess.Parameters.ParamByName('place_number').Value := qryOra.FieldByName('place_number').Value;
   qryAccess.Parameters.ParamByName('place_name').Value := qryOra.FieldByName('place_name').Value;
   qryAccess.Parameters.ParamByName('workers_count').Value := qryOra.FieldByName('workers_count').Value;
   qryAccess.Parameters.ParamByName('refresh_datetime').Value := qryOra.FieldByName('refresh_datetime').Value;

   qryAccess.ExecSQL;

   qryOra.Next;
 end;

 qryOra.Close;

end;



Заранее спасибо всем откликнувшимся.


alsov   (2005-09-12 12:12:00) [1]

раз программулина отказывается работать с такой таблицой, создать в аксесе запрос SELECT * из нее, может, с запросом программулина будет сговорчивее?

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

Пробовал сделать запрос типа INSERT INTO Access_Table (param1..) in 'c:\test.mdb' 'Access' SELECT * FROM system.Ora_Table, но оракл его не скушал.

Так как нужно решить быстро, а не кравсиво не стал разбираться с репликацией оракла(т.к. быстро разобраться не получилось бы).

Придумал вот такое извращение:
Создал в аксесе линк на оракл + такую же пустую таблицу(которую видит спец. прогамма), и запросом типа INSERT INTO TableCopy (param1..) SELECT (param1..) FROM Link_Ora_Table переписываю данные.

Если придумаю лучшее решение - сообщу.


Nikolay M.   (2005-09-11 19:50:00) [2]


> AlexWlad ©   (11.09.05 19:10) [4]
> Нашел!!!
> В OLEDB есть IRowsetFastload.

Этот интерфейс реализован в провайдере SQLOLEDB (SQL Server, используется, например, в bulk insert), но не в JET.OLEDB (собственно, ахсекс). Хотя, если автор найдет провайдер для jet с реализованным IRowsetFastload, да еще сможет заставить его работать - буду только рад услышать об этом.
Вообще, правильный способ - это воспользоваться репликационными возможностями оракла, чтобы не гонять каждый раз таблицу целиком (естественно, если таблица не обновляется настолько часто, что копирование только изменений становится неоправданым). На элементарном уровне - хотя бы триггерами.
Еще интересует вариант малой крови: нельзя слинковать в аксессе таблицу с оракловой и, раз программулина отказывается работать с такой таблицой, создать в аксесе запрос SELECT *из нее, может, с запросом программулина будет сговорчивее?


alsov   (2005-09-11 19:22:00) [3]

Спасибо огромное, завтра попробую.
О результатах труда сообщу


AlexWlad   (2005-09-11 19:10:00) [4]

Нашел!!!
В OLEDB есть IRowsetFastload. Подробности в MSDN или на РСДН, т.к. я в интерфейсах не очень...


AlexWlad   (2005-09-11 18:56:00) [5]

Ну, хорошо...
Тогда вместо insert-values можно попробовать insert-into-select-from, и никаких циклов...
MSSQL Data TransformationService работает через какой-то хитрый RowSet из ADO. Года 2 назад на РСДН пробегало что-то на эту тему.
Кстати, а можно в Оракле Аксес сделать линкед-сервером как в MSSQL? Тогда, думаю, все будет гораздо проще.


alsov   (2005-09-11 16:41:00) [6]

Ну и какой в этом великий сакральный смысл. Одно дело этот mdb уносить куда-то, а так...

Поверьте не от хорошей жизни занимаюсь подобными извращениями.

Скажем так - есть некий программный продукт, который может черпать данный только из аксеса. Необходимо связать этот продукт с основной базой, организованой на оракле.

Линки, которые можно сделать в аксессе это прога не поддерживает - выдайт ошибку о невозможности получить данные.

Вот и приходиться искать другие пути решения.


AlexWlad   (2005-09-11 16:04:00) [7]

Перенос информации из оракла в аксес и поддержание таблицы аксеса в актуальном состоянии(обновлять скажем каждые 5 минут).

Ну и какой в этом великий сакральный смысл. Одно дело этот mdb уносить куда-то, а так... Ну создай ты в Аксесе линк на оракловскую таблицу и пользуй на здоровье.


Наверх

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