【问题标题】:How can I automate exporting of an Oracle table/view?如何自动导出 Oracle 表/视图?
【发布时间】:2015-10-03 06:07:35
【问题描述】:

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

这似乎真的很不雅,因为分隔符、行大小和页面大小似乎会在数据中产生很多错误。

有没有比 sqlplus 更好的方法来实现这一点?

【问题讨论】:

    标签: oracle csv cron sqlplus


    【解决方案1】:

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

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

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

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

    简短的回答是视情况而定——这可能就是为什么有人对你的问题投了反对票。

    【讨论】:

    • 我对sqlplus不是很熟悉,但是我学得很快,表(特别对导出视图感兴趣)会一直在oracle中。我似乎无法在我的 sqlplus 脚本中获得正确的格式,因为输出总是有大量的空格和空值。
    【解决方案2】:

    我不确定 SQL*Plus 配置元素是否会导致输出出现问题 -- 如果是,请就此提出第二个问题。

    您可以探索的一种方法是使用 DBMS_Scheduler 驱动的 PL/SQL 程序通过 UTL_FILE 写出数据。如果您认为导出过程是数据库功能的一部分,那么这将是一个不错的选择。

    我还想知道您想如何处理这些数据?单独导出的数据只是使用磁盘空间。

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

    【讨论】:

    • 我正在将数据导入数据可视化工具 (SAS Visual Analytics)。如何直接使用 SQL 进行连接,还是依赖于 SAS VA 的 ETL 功能?
    • 这最好作为一个新问题提出。
    【解决方案3】:

    您可以尝试在 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 驱动程序...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多