powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Перенести данные из другой базы данных - есть более изящное решение?
8 сообщений из 8, страница 1 из 1
Перенести данные из другой базы данных - есть более изящное решение?
    #39887151
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня.
Есть необходимость периодически переносить данные из одной базы в другую (что-то вроде репликации, а скорее ведение архива операций). Пока использую такое решение
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
execute block
as
declare variable OPID type of column OPERS.OPID;
declare variable OPCAIDOWN type of column OPERS.OPCAIDOWN;
declare variable OPTYPE type of column OPERS.OPTYPE;
...
declare variable OPTOCARD type of column OPERS.OPTOCARD;
begin
  for execute statement 'select * from opers  where OPDATE > dateadd(-10 day to current_timestamp)'
          on external data source '192.168.97.1:d:basa\dbserver.fdb'
          as user 'SYSDBA' password 'masterkey'
          with autonomous transaction
          into :OPID, :OPCAIDOWN, :OPTYPE, ... :OPTOCARD

  do
    update or insert into OPERS (OPID, OPCAIDOWN, OPTYPE, ...
                                 OPTOCARD)
    values (:OPID, :OPCAIDOWN, :OPTYPE, ... :OPTOCARD);
end


Может есть более красивый способ делать тоже самое без необходимости использования локальных переменных или использовать результат "execute statement" прямо для "update or insert".? Просто таблиц переносить надо много, и полей немало.
...
Рейтинг: 0 / 0
Перенести данные из другой базы данных - есть более изящное решение?
    #39887156
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,

зачем здесь with autonomous transaction?

GrigoriyFominМожет есть более красивый способ делать тоже самое без необходимости использования локальных переменных или использовать результат "execute statement" прямо для "update or insert".?

нет.

Можно организовать PSQL пакет с процедурами, каждая из которых вытаскивает свои данные из внешней БД. А саму заливку делать простыми запросами используя выборки из этих ХП
...
Рейтинг: 0 / 0
Перенести данные из другой базы данных - есть более изящное решение?
    #39887164
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
GrigoriyFomin,

Можно организовать PSQL пакет с процедурами, каждая из которых вытаскивает свои данные из внешней БД. А саму заливку делать простыми запросами используя выборки из этих ХП

не проблема это запихнуть в хранимки, оно итак там будет, это я для отладки вытащил в execute block, только это не решает создания переменных, указания их типа и всего сопутствующего стаффа. Вообщем, как и подозревал, более простого пути нет :((
...
Рейтинг: 0 / 0
Перенести данные из другой базы данных - есть более изящное решение?
    #39887168
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,

Мне кажется проблему бы решил тип данных "ЗАПИСЬ" с обращением к полям вида ROW.Field или по индексу, но это скорее в "хотелки"
...
Рейтинг: 0 / 0
Перенести данные из другой базы данных - есть более изящное решение?
    #39887205
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,

сделай генератор хранимок. Передавай ему список таблиц для копирования, пусть создает.
...
Рейтинг: 0 / 0
Перенести данные из другой базы данных - есть более изящное решение?
    #39887209
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё
GrigoriyFomin,

сделай генератор хранимок. Передавай ему список таблиц для копирования, пусть создает.


вот эта мысля меня тоже посещала с дружеским визитом. А готовых скриптов таких нигде не валяется?
...
Рейтинг: 0 / 0
Перенести данные из другой базы данных - есть более изящное решение?
    #39887234
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,

на ibase есть примеры, как получать нужные метаданные. А дальше уже ручками.
...
Рейтинг: 0 / 0
Перенести данные из другой базы данных - есть более изящное решение?
    #39887626
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select 'execute block '||ascii_char(13)||
             'returns (CNT integer) '||ascii_char(13)||
             'as '||ascii_char(13)||
             'declare variable V$SQL varchar(32000);'||ascii_char(13)||
             list('declare variable '||trim(rf.RDB$FIELD_NAME)||' type of column '||trim(rf.RDB$RELATION_NAME)||'.'||trim(rf.RDB$FIELD_NAME)||';', ascii_char(13))||ascii_char(13)||
             'begin'||ascii_char(13)||
             '   CNT = 0;'||ascii_char(13)||
             '   V$SQL = ''select '||list(trim(rf.RDB$RELATION_NAME)||'.'||trim(rf.RDB$FIELD_NAME),', ')||' from '||trim(rf.RDB$RELATION_NAME)||' '||:V$WHERE||''';'||ascii_char(13)||
             '   for execute statement (:V$SQL)'||ascii_char(13)||
             '       on external '''||:ADB||''''||ascii_char(13)||
             '       as user '''||:AUSER||''' password '''||:APASS||''''||ascii_char(13)||
             '       with common transaction'||ascii_char(13)||
             '       into '||list(':'||trim(rf.RDB$FIELD_NAME),', ')||ascii_char(13)||
             '    do begin '||ascii_char(13)||
             '       CNT = CNT + 1;'||ascii_char(13)||
             '       update or insert into '||trim(rf.RDB$RELATION_NAME)||'('||list(trim(rf.RDB$FIELD_NAME),', ')||')'||ascii_char(13)||
             '       values ('||list(':'||trim(rf.RDB$FIELD_NAME),', ')||');'||ascii_char(13)||
             '       end'||ascii_char(13)||
             '   suspend;'||ascii_char(13)||
             'end'
      from RDB$RELATION_FIELDS rf
      join RDB$FIELDS f on rf.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
                       and f.RDB$COMPUTED_SOURCE is null
      where rf.RDB$RELATION_NAME = :TN
        and rf.RDB$FIELD_NAME <> :AFN_PHOTO
      group by rf.RDB$RELATION_NAME
      into :V$SQL;
      execute statement :V$SQL into :V$CNT;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Перенести данные из другой базы данных - есть более изящное решение?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]