Перенос данных из нескольких таблиц из SQL Server в Oracle - PullRequest
2 голосов
/ 11 марта 2019

У меня есть сценарий для переноса таблиц SQL Server (30-40 таблиц) в Oracle. Я не могу зависеть от служб SSIS, поскольку количество таблиц, которые нужно перенести в Oracle, будет регулярно меняться, и я не всегда могу создавать или обновлять DFT, когда происходит изменение схемы. Есть ли другой способ динамического перемещения данных и его эффективной работы? Как использовать Python или любые другие языки программирования?

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

C # подход - библиотека SchemaMapper

Поскольку вы открыты для решения, использующего язык программирования, я думаю, вы можете воспользоваться библиотекой классов SchemaMapper , которая является проектом с открытым исходным кодом, опубликованным на GitHub. Полное описание можно найти в файле Readme по ссылке выше.

Важное примечание. Вчера я добавил поддержку чтения данных из баз данных (SQL Server, Oracle ...) и возможность экспорта данных в Oracle.

В этом ответе я предоставлю информацию об импорте таблиц SQL Server, создам соответствующий класс SchemaMapper для каждой (поскольку они имеют разные схемы, и вам необходимо импортировать их в разные схемы) и как экспорт данных в Oracle.

//First of all list the tables names need to import
string[] TableNameFilter = new[] { "Table1", "Table2" };
//Create an instance of the oracle import class
SchemaMapper.Exporters.OracleExport expOracle = new SchemaMapper.Exporters.OracleExport(oracleconnectionstring);

//Create an SQL Server import class
using (SchemaMapper.Converters.SqlServerCeImport ssImport = new SchemaMapper.Converters.SqlServerCeImport(sqlconnectionstring))
{

    //Retrieve tables names
    ssImport.getSchemaTable();

    //loop over tables matching the filter
    foreach(DataRow drRowSchema in ssImport.SchemaTable.AsEnumerable().Where(x => 
                                                                      TableNameFilter.Contains(x["TABLE_NAME"].ToString())).ToList())
    {

        string SQLTableName = drRowSchema["TABLE_NAME"].ToString();
        string SQLTableSchema = drRowSchema["TABLE_SCHEMA"].ToString();

        DataTable dtSQL = ssImport.GetDataTable(SQLTableSchema, SQLTableName);

        //Create a schema mapping class
        using (SchemaMapper.SchemaMapping.SchemaMapper sm = new SchemaMapper.SchemaMapping.SchemaMapper(SQLTableSchema, SQLTableName))
        {

            foreach (DataColumn dc in dtSQL.Columns)
            {

                SchemaMapper_Column smCol = new SchemaMapper_Column();
                smCol.Name = dc.ColumnName;


                smCol.Name = dc.ColumnName;
                smCol.DataType = smCol.GetCorrespondingDataType(dc.DataType.ToString(), dc.MaxLength);

                sm.Columns.Add(smCol);

            }

            //create destination table in oracle
            expOracle.CreateDestinationTable(sm);

            //Insert data
            expOracle.InsertUsingOracleBulk(sm, dtSQL);

            //there are other methods such as :
            //expOracle.InsertIntoDb(sm, dtSQL);
            //expOracle.InsertIntoDbWithParameters(sm, dtSQL);

        }

    }




}

Примечание: это проект с открытым исходным кодом: он не полностью протестирован и поддерживаются не все типы данных, если вы столкнулись с некоторыми ошибками, не стесняйтесь оставить отзыв или добавить проблему в GitHub


Другой подход - мастер импорта и экспорта SQL Server

Если вы можете сделать это без планирования задания, то вы можете использовать мастер импорта и экспорта, который позволяет импортировать несколько таблиц в Oracle без необходимости создавать пакеты вручную. Он будет создавать пакеты, таблицы назначения, столбцы карты и импортировать данные.

1 голос
/ 17 марта 2019

Вот подход, который я решил использовать с учетом ограничения по времени (использование C # отнимает больше времени). Для таблицы 8 ГБ процесс переноса SQL в Oracle занимает 11 минут.

Шаги:

  1. Дамп данных таблиц SQL в плоские файлы. (Используется BIML для автоматизации создание DFT)
  2. Передайте эти плоские файлы на сервер назначения.
  3. Использование SQL * Loader для загрузки данных из плоских файлов в Oracle.
...