Каков наилучший способ преобразовать одну таблицу Oracle (данные) для заполнения немного другой таблицы Oracle?

StackOverflow https://stackoverflow.com/questions/4281476

Вопрос

У меня есть две таблицы Oracle, старая и новая.Старая таблица была плохо спроектирована (заметьте, в большей степени, чем моя), но есть много текущих данных, которые необходимо перенести в новую таблицу, которую я создал.

В новой таблице есть новые столбцы, другие столбцы.

Я думал просто написать PHP-скрипт или что-то в этом роде с целой кучей замен строк...хотя очевидно, что это глупый способ сделать это.

Мне бы тоже очень хотелось иметь возможность немного почистить данные по ходу дела.Некоторые из них были сохранены с разметкой в них (например:"
Имя
"), много пустого места и т.д., поэтому я бы действительно хотел исправить все это, прежде чем помещать в новую таблицу.

Есть ли у кого-нибудь опыт в выполнении чего-либо подобного?Что мне следует делать?

Спасибо :)

Это было полезно?

Решение

Я бы заказал инструмент ETL, такой как Pentaho Чайник.Вы сможете запросить данные из старой таблицы, преобразовать и очистить их, а также повторно вставить в новую таблицу, и все это с помощью удобного инструмента WYSIWYG.

Вот предыдущий вопрос, на который я ответил относительно переноса данных и манипулирования ими с помощью Kettle.
Используя Pentaho Kettle, как мне загрузить несколько таблиц из одной таблицы, сохраняя целостность ссылок?

Другие советы

Я делаю это совсем немного - вы можете выполнить миграцию с помощью простого select statememt:

create table newtable as select 
 field1,
 trim(oldfield2) as field3,
 cast(field3 as number(6)) as field4,
 (select pk from lookuptable where value = field5) as field5,
 etc,
from
 oldtable

На самом деле очень мало того, что вы могли бы сделать с промежуточным языком, таким как php и т.д., Чего вы не можете сделать в родном SQL, когда дело доходит до очистки и преобразования данных.

Для более сложной очистки вы всегда можете создать sql-функцию, которая выполняет тяжелую работу, но я очистил некоторые довольно ужасные данные, не прибегая к этому.Не забывайте, что в oracle у вас есть инструкции decode, case и т.д.

Если объемы данных невелики и если вы собираетесь сделать это только один раз, то вам будет трудно превзойти программу "сделай сам".Особенно, если у вас есть какая-то пользовательская логика, которую вам нужно реализовать.Время, затраченное на загрузку, изучение и использование инструмента (такого как pentaho и т.д.), Вероятно, не будет стоить вашего времени.

Кодирование select *, обновление столбцов в памяти и вставка в них будут быстро выполнены на PHP или любом другом языке программирования.

Тем не менее, если вы обнаружите, что делаете это часто, то, возможно, стоит изучить инструмент ETL.

Я сам работаю над аналогичным проектом - переношу данные из одной модели, содержащей пару десятков таблиц, в несколько иную модель с аналогичным количеством таблиц.

Я использовал подход создания инструкции MERGE для каждой целевой таблицы.Исходный запрос получает все необходимые данные, форматирует их по мере необходимости, затем выполняется слияние, если строка уже существует, и обновляется / вставляется по мере необходимости.Таким образом, я могу запускать инструкцию несколько раз по мере разработки решения.

Зависит от того, насколько сложен процесс преобразования.Если это достаточно легко выразить в одном операторе SQL, то все готово;просто создайте инструкцию SELECT, а затем выполните инструкцию CREATE TABLE / INSERT.Однако, если вам нужно выполнить какое-то сложное преобразование или (с содроганием) разделить или объединить любую из строк, чтобы преобразовать их должным образом, вам следует использовать конвейерную табличную функцию.Хотя, похоже, это не так;старайтесь придерживаться одного утверждения, как предложил другой Крис выше.Ты определенно это делаешь нет хотите извлечь данные из базы данных, чтобы выполнить преобразование, поскольку передача в Oracle и из Oracle всегда будет медленнее, чем хранение всего этого в базе данных.

Еще пара советов:

  • Если таблица уже существует и вы выполняете операцию INSERT...Оператор SELECT, используйте подсказку /*+ APPEND */ для вставки, чтобы выполнить массовую операцию.Обратите внимание, что CREATE TABLE делает это по умолчанию (насколько это возможно;вы не можете выполнять массовые операции при определенных условиях, напримересли новая таблица является таблицей, организованной по индексу, имеет триггеры и т.д.
  • Если вы используете версию 10.2 или более позднюю, вам также следует рассмотреть возможность использования РЕГИСТРИРУЙТЕ ОШИБКИ В предложение для занесения отклоненных записей в таблицу ошибок.Таким образом, вы не потеряете всю операцию, если в одной записи обнаружится ошибка, которой вы не ожидали.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top