Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

Копирование данных из вьюхи в оракле в таблицу в Access   Найти похожие ветки 

 
alsov ©   (2005-09-11 15:04) [0]

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

Есть следующая задача: Перенос информации из оракла в аксес и поддержание таблицы аксеса в актуальном состоянии(обновлять скажем каждые 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;



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


 
AlexWlad ©   (2005-09-11 16:04) [1]

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

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


 
alsov ©   (2005-09-11 16:41) [2]

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

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

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

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

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


 
AlexWlad ©   (2005-09-11 18:56) [3]

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


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

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


 
alsov ©   (2005-09-11 19:22) [5]

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


 
Nikolay M. ©   (2005-09-11 19:50) [6]


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

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


 
alsov ©   (2005-09-12 12:12) [7]

раз программулина отказывается работать с такой таблицой, создать в аксесе запрос 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 переписываю данные.

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



Страницы: 1 вся ветка

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.034 c
2-1128133857
Dvayanu
2005-10-01 06:30
2005.10.23
Поиск по текстовому файлу в реальном времени.


2-1127977419
V-A-V
2005-09-29 11:03
2005.10.23
Помогите разобраться с запросом


11-1109010924
deniss
2005-02-21 21:35
2005.10.23
не могу найти стрелочный индикатор , сам пока не напишу :(


14-1127987466
LamerLama
2005-09-29 13:51
2005.10.23
USB-host controller (???)


4-1124405168
NikNet
2005-08-19 02:46
2005.10.23
помогите сохранить экран на API...?