![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование данных из вьюхи в оракле в таблицу в 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 уносить куда-то, а так... Ну создай ты в Аксесе линк на оракловскую таблицу и пользуй на здоровье.