Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

Копирование данных из вьюхи в оракле в таблицу в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.029 c
14-1128183159
syte_ser78
2005-10-01 20:12
2005.10.23
12 дней не курю!


1-1128055083
DrAndrey
2005-09-30 08:38
2005.10.23
Как сделать TComboBox плоским, Ctl3D:= True - не помогает?


14-1128271384
Piter
2005-10-02 20:43
2005.10.23
Прикольно блин :)


4-1124309849
ronyn
2005-08-18 00:17
2005.10.23
Как работать с WM_QUERYENDSESSION?


1-1127747662
Pass[word]
2005-09-26 19:14
2005.10.23
Помогите перемножить две матрицы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский