Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 миграция дерева ...  [new]
копосов нв
Member

Откуда:
Сообщений: 442
Как мегрировать дерево подразделений из Oracle в Access если
структура дерева построена на id,idparent и name там и там, но типы полей разные? Например в Oracle:

id (тип Char 16 Byte) idparent (тип Char 16 Byte) name
80013E8CEF1E9636 80013E8CEF1E9635 Аппарат
80013E8CEF1E9658 80013E8CEF1E9636 отдел 1
80013E8CEF1E9639 80013E8CEF1E9636 отдел 2
80013E8CEF1E9B02 80013E8CEF1E9636 отдел 3

а в Access:

id (тип Числовой) idparent (тип Числовой) name
1 0 Аппарат
2 1 отдел 1
3 1 отдел 2
4 1 отдел 3

Больше интересует алгоритм переноса, а средствами чего переносить разберусь.
12 июл 06, 17:18    [2872900]     Ответить | Цитировать Сообщить модератору
 Re: миграция дерева ...  [new]
Тохен
Guest
CREATE TABLE t(ID VARCHAR2(16),UP VARCHAR2(16),NAME VARCHAR2(16));
INSERT INTO t
     VALUES ('80013E8CEF1E9636', '80013E8CEF1E9635', 'Аппарат');
INSERT INTO t
     VALUES ('80013E8CEF1E9658', '80013E8CEF1E9636', 'Отдел 1');
INSERT INTO t
     VALUES ('80013E8CEF1E9639', '80013E8CEF1E9636', 'Отдел 2');
INSERT INTO t
     VALUES ('80013E8CEF1E9B02', '80013E8CEF1E9636', 'Отдел 3');
COMMIT ;

SELECT for_id.new_id AS ID
      ,for_up.new_id AS UP
      ,t.NAME
  FROM t
      , (SELECT ROWNUM AS new_id
               ,ID AS old_id
           FROM (SELECT   ID
                     FROM t
                 ORDER BY ID)) for_id
      , (SELECT ROWNUM AS new_id
               ,ID AS old_id
           FROM (SELECT   ID
                     FROM t
                 ORDER BY ID)) for_up
 WHERE t.ID = for_id.old_id(+) AND t.UP = for_up.old_id(+);
 
 
 drop table t;
12 июл 06, 17:38    [2873046]     Ответить | Цитировать Сообщить модератору
 Re: миграция дерева ...  [new]
копосов нв
Member

Откуда:
Сообщений: 442
Тохен
CREATE TABLE t(ID VARCHAR2(16),UP VARCHAR2(16),NAME VARCHAR2(16));
INSERT INTO t
     VALUES ('80013E8CEF1E9636', '80013E8CEF1E9635', 'Аппарат');
INSERT INTO t
     VALUES ('80013E8CEF1E9658', '80013E8CEF1E9636', 'Отдел 1');
INSERT INTO t
     VALUES ('80013E8CEF1E9639', '80013E8CEF1E9636', 'Отдел 2');
INSERT INTO t
     VALUES ('80013E8CEF1E9B02', '80013E8CEF1E9636', 'Отдел 3');
COMMIT ;

SELECT for_id.new_id AS ID
      ,for_up.new_id AS UP
      ,t.NAME
  FROM t
      , (SELECT ROWNUM AS new_id
               ,ID AS old_id
           FROM (SELECT   ID
                     FROM t
                 ORDER BY ID)) for_id
      , (SELECT ROWNUM AS new_id
               ,ID AS old_id
           FROM (SELECT   ID
                     FROM t
                 ORDER BY ID)) for_up
 WHERE t.ID = for_id.old_id(+) AND t.UP = for_up.old_id(+);
 
 
 drop table t;


Ага, огромное спасибо. Но возникла проблема такого плана, если в access поле id типа счётчик (инкрементное) как быть в таком случае. Хотябы предположения или идеи?
12 июл 06, 17:57    [2873149]     Ответить | Цитировать Сообщить модератору
 Re: миграция дерева ...  [new]
Тохен
Guest
копосов нв
Ага, огромное спасибо. Но возникла проблема такого плана, если в access поле id типа счётчик (инкрементное) как быть в таком случае. Хотябы предположения или идеи?


Как вариант - перенести сначала в Access, добавив колонки ID и UP в Access под другими именами. При вставке он тебе заполнит ID инкрементом. Потом подобным селектом (без rownum, вместо него уже будут значения) сопоставишь поля, перенесенные из Oracle с новым ID => обнвишь UP для Access.

Удачи.
12 июл 06, 18:15    [2873233]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить