2015-07-14 3 views
0

У меня есть таблица в Oracle, которую мне нужно экспортировать как файл, xls, csv или иначе. В настоящее время я пытаюсь сделать это с помощью sqlplus, чтобы экспортировать представление в csv в сценарий оболочки, который настроен как cronjob.Как я могу автоматизировать экспорт таблицы/представления Oracle?

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

Есть ли лучший способ достичь этого, чем sqlplus?

ответ

1

Я не уверен, что элементы конфигурации SQL * Plus должны вызывать проблемы с выходом, если они есть, а затем открыть второй вопрос.

Один из методов, который вы можете изучить, - это использование PL/SQL-программы, управляемой DBMS_Scheduler, для записи данных с помощью UTL_FILE. Если вы считаете, что процесс экспорта является частью вашей функциональности базы данных, это будет хорошим путем.

Я также хочу знать, что вы хотите делать с этими данными? Экспортированные данные сами по себе просто используют дисковое пространство.

Вы импортируете его в другую систему? Если это так, было бы более надежно подключаться к базе данных из этой системы и извлекать данные с помощью SQL, поскольку запись данных на диск всегда чревата проблемами, связанными с форматами даты, наличием CR LF в данных, числовых форматах и ​​т. Д. .

+0

Я импортирую данные в инструмент визуализации данных (SAS Visual Analytics). Как можно напрямую подключиться к SQL, или это зависит от возможностей ETL SAS VA? – KinsDotNet

+0

Это будет лучше задавать как новый вопрос. –

1

На этот вопрос нет единого правильного ответа - это зависит от ряда других факторов. Вы очень хорошо знакомы с sqlplus? Эта таблица всегда будет в Oracle?

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

Однако, если данные могут покинуть Oracle, вы можете попробовать что-то более общее. Как простая JDBC-программа (если вам нравится Java) или что-то подобное на вашем любимом языке сценариев, что позволит вам легко структурировать данные в формате, который вам нужен для вашего дамп-файла.

В качестве альтернативы, если в вашей группе есть любимый инструмент ETL, вы можете захотеть использовать это.

Короткий ответ - это зависит от того, почему, возможно, кто-то проголосовал за ваш вопрос.

+0

Я не очень хорошо знаком с SQLPLUS , но я учусь быстро, таблица (особенно заинтересованная в экспорте представления) всегда будет в оракуле. Я не могу получить форматирование прямо в моем скрипте sqlplus, так как вывод всегда имеет тонну пробелов и пустых значений. – KinsDotNet

0

вы можете попробовать использовать этот подход в SQL Plus:

[email protected]> set feed off markup html on spool on 
[email protected]> spool 'c:\test.xls' 
<br> 
[email protected]&gt; select 1 from dual; -- or any other query/queries 
... 
[email protected]&gt; spool off 
<br> 
[email protected]&gt; set markup html off spool off 
<br> 
[email protected]> 

Или вы можете написать свой собственный инструмент в Java. Это довольно просто. :)

DbUnitExport.java:

import org.dbunit.database.DatabaseConfig; 
import org.dbunit.database.DatabaseConnection; 
import org.dbunit.database.IDatabaseConnection; 
import org.dbunit.dataset.IDataSet; 
import org.dbunit.dataset.excel.XlsDataSet; 
import org.dbunit.ext.oracle.OracleDataTypeFactory; 

import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.sql.Connection; 
import java.sql.DriverManager; 

public class DbUnitExport { 
    public static void main(String[] args) throws Exception { 
     if (args.length != 5 && args.length != 6) { 
      System.err.println("java -jar export.jar host port sid user password [filename.xls]"); 
      System.exit(1); 
     } 

     final Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@" + args[0] + ":" + args[1] + "/" + args[2], args[3], args[4]); 
     final IDatabaseConnection databaseConnection = new DatabaseConnection(connection, args[3]); 
     final DatabaseConfig config = databaseConnection.getConfig(); 
     config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory()); 

     final IDataSet fullDataSet = databaseConnection.createDataSet(); 
     final String fileName = args.length == 6 ? args[5] : "full.xls"; 
     XlsDataSet.write(fullDataSet, new BufferedOutputStream(new FileOutputStream(fileName))); 
    } 
} 

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

Смежные вопросы