Каков наилучший способ преобразования одной таблицы (данных) Oracle в слегка отличную таблицу Oracle? - PullRequest
2 голосов
/ 26 ноября 2010

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

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

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

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

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

Спасибо:)

Ответы [ 5 ]

7 голосов
/ 26 ноября 2010

Я делаю это совсем немного - вы можете мигрировать с помощью простого 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, которая выполняет тяжелую работу, но я очистил некоторые довольно ужасные данные, не прибегая к этому. Не забывайте, в оракуле у вас есть декодирование, регистр и т. Д.

0 голосов
/ 26 ноября 2010

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

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

  • Если таблица уже существует и вы выполняете инструкцию INSERT ... SELECT, используйте подсказку / * + APPEND * / для вставки, чтобы выполнить массовую операцию,Обратите внимание, что CREATE TABLE делает это по умолчанию (насколько это возможно; вы не можете выполнять массовые операции при определенных условиях, например, если новая таблица представляет собой таблицу с индексами, имеет триггеры и т. Д.
  • Если выв версии 10.2 или более поздней вы также должны рассмотреть возможность использования предложения LOG ERRORS INTO для записи отклоненных записей в таблицу ошибок. Таким образом, вы не потеряете всю операцию, если в одной записи будет ошибка, которой вы не сделали.не ожидаю.
0 голосов
/ 26 ноября 2010

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

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

0 голосов
/ 26 ноября 2010

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

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

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

0 голосов
/ 26 ноября 2010

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

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

...