如何自动导出Oracle表/视图?

时间:2015-07-14 14:24:10

标签: oracle csv cron sqlplus

我在Oracle中有一个表,我需要将其导出为文件,xls,csv或其他方式。我目前正在尝试使用sqlplus将视图导出到shell脚本中的csv,该脚本设置为cronjob。

这似乎非常不优雅,因为分隔符,行大小和页面大小似乎在数据中产生了很多错误。

有没有比sqlplus更好的方法来实现这个目标?

3 个答案:

答案 0 :(得分:1)

这个问题没有一个正确的答案 - 这取决于许多其他因素。你对sqlplus很熟悉吗?这个表总是在Oracle中吗?

我认为如果两个问题的答案都是肯定的,那么你的方法很好,你可以在很大程度上使用SQLPLUS自定义表格输出,包括弄乱线条大小和页面大小。

但是,如果数据可能会移出Oracle,您可能需要尝试更通用的内容。就像一个简单的JDBC程序(如果你喜欢java)或者你喜欢的脚本语言类似的东西,它可以让你轻松地将数据结构化为转储文件所需的格式。

或者,如果您的组中有一个最喜欢的ETL工具,您可能希望使用它。

简短的答案取决于 - 这可能是有人向你投票的原因。

答案 1 :(得分:1)

我不确定SQL * Plus配置元素是否会导致输出问题 - 如果是,则打开第二个问题。

您可以探索的一种方法是使用DBMS_Scheduler驱动的PL / SQL程序使用UTL_FILE写出数据。如果您认为导出过程是数据库功能的一部分,那么这将是一条很好的途径。

我还想知道你想对这些数据做些什么?单独导出的数据就是使用磁盘空间。

您是否将其导入另一个系统?如果是这样,从该系统连接到数据库并使用SQL提取数据会更加健壮,因为将数据写入磁盘始终充满了与日期格式,数据中CR LF的存在,数字格式等有关的问题。

答案 2 :(得分:0)

您可以尝试在SQL Plus中使用此方法:

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

或者您可以用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驱动程序......