2010-11-25 3 views
2

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

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

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

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

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

Спасибо :)

+0

Вопрос является бит слишком общий. Вы ищете инструмент для очистки данных или INSERT ... SELECT ... с набором функций, регулярных выражений и т. д. Какие типы данных вы говорите (мегабайты, гигабайты или терабайты). – 2010-11-25 23:50:18

ответ

0

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

Вот предыдущий вопрос, на который я ответил в отношении переноса данных и манипуляций с чайником.
Using Pentaho Kettle, how do I load multiple tables from a single table while keeping referential integrity?

0

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

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

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

7

Я делаю это совсем немного - можно перенести с простым выбором 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

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

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

0

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

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

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