Чтение большого объема данных из базы данных Oracle и их экспорт в файл.dat с использованием C#
У нас есть запрос, который будет выполняться ежемесячно и возвращает данные размером 1 ГБ.
Используемый здесь запрос - это просто запрос на выборку с внутренними объединениями, без использования курсора.
В настоящее время они выполняют этот запрос в Toad и экспортируют данные из окна вывода в виде файла.dat.
Обратите внимание, что выполнение этого вручную с помощью жабы занимает 2 часа времени.
После этого они изменяют текст заголовка в файле.dat, чтобы иметь осмысленные имена, чтобы поделиться им с нашими клиентами.
Я хочу автоматизировать этот процесс, создав исполняемый файл, который будет делать этот процесс.
Снимок кода выглядит следующим образом
using (OracleConnection conn = new OracleConnection())
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
conn.Open();
using (OracleCommand cmd = new OracleCommand(commandText))
{
cmd.Connection = conn;
using (OracleDataReader dtReader = cmd.ExecuteReader())
{
outputContent = new StringBuilder();
while (dtReader != null && dtReader.Read())
{
for (int i = 0; i < dtReader.FieldCount; i++)
{
outputContent.Append(dtReader[i]);
outputContent.Append(delimiter);
}
outputContent = outputContent.Replace(delimiter, Environment.NewLine, outputContent.Length - 1, 1);
}
}
}
}
outputPath = string.Format(ConfigurationManager.AppSettings["OutputPath"], DateTime.Now.Ticks);
outputStream = new StreamWriter(outputPath, true);
//Export
outputStream.Write(outputContent.ToString());
outputStream.Close();
Из журнала выяснилось, что оператор execute reader завершен в течение нескольких секунд.
Но при чтении данных из устройства чтения данных выдается сообщение "Исключением является ORA-03113: конец файла в канале связи в System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)" через 8 часов.
Может ли кто-нибудь, пожалуйста, дайте мне знать, что вышеупомянутый подход хорош для обработки данных размером 1 ГБ? или же
Есть ли другой лучший способ сделать это?
Спасибо, Гаятри
2 ответа
Вы можете экспортировать данные напрямую из процедуры PL/SQL и иметь файл оболочки (вместо exe), который запускает их из SqlPlus.
Смотрите этот вопрос на SO о том, что поставить в процедуру экспорта данных.