Форум: "Базы";
Текущий архив: 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