如何自动导出 Oracle table/view?
How can I automate exporting of an Oracle table/view?
我在 Oracle 中有一个 table,我需要将其导出为文件、xls、csv 或其他格式。我目前正在尝试使用 sqlplus 将视图导出到 shell 脚本中的 csv,该脚本设置为 cronjob。
这似乎真的很不雅,因为分隔符、行大小和页面大小似乎会在数据中产生很多错误。
有没有比 sqlplus 更好的方法来完成此任务?
这个问题没有唯一的正确答案 - 它取决于许多其他因素。你对sqlplus很熟悉吗?这 table 会一直出现在 Oracle 中吗?
我认为如果这两个问题的答案都是肯定的,那么您的方法很好,您可以使用 SQLPLUS 在很大程度上自定义 table 输出,包括调整行大小和页面大小。
但是,如果数据可能会移出 Oracle,您可能想尝试更通用的方法。像一个简单的 JDBC 程序(如果你喜欢 java)或你最喜欢的脚本语言中的类似东西,可以让你轻松地将数据结构化为转储文件所需的格式。
或者,如果您的团队中有最喜欢的 ETL 工具,您可能希望使用它。
简短的回答视情况而定 - 这可能就是为什么有人不赞成你的问题。
我不确定 SQL*Plus 配置元素是否会导致输出出现问题——如果是,请提出第二个问题。
您可以探索的一种方法是使用 DBMS_Scheduler-driven PL/SQL 程序用 UTL_FILE 写出数据。如果您认为导出过程是数据库功能的一部分,那么这将是一个不错的选择。
我还想知道你想用这些数据做什么?单独导出的数据仅使用磁盘 space.
您要将其导入另一个系统吗?如果是这样,从该系统连接到数据库并使用 SQL 提取数据会更稳健,因为将数据写入磁盘总是充满了有关日期格式的问题,数据中是否存在 CR LF,数字格式等
您可以尝试在 SQL 中使用此方法,另外:
test@ORADEV> set feed off markup html on spool on
test@ORADEV> spool 'c:\test.xls'
<br>
test@ORADEV> select 1 from dual; -- or any other query/queries
...
test@ORADEV> spool off
<br>
test@ORADEV> 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 驱动程序...
我在 Oracle 中有一个 table,我需要将其导出为文件、xls、csv 或其他格式。我目前正在尝试使用 sqlplus 将视图导出到 shell 脚本中的 csv,该脚本设置为 cronjob。
这似乎真的很不雅,因为分隔符、行大小和页面大小似乎会在数据中产生很多错误。
有没有比 sqlplus 更好的方法来完成此任务?
这个问题没有唯一的正确答案 - 它取决于许多其他因素。你对sqlplus很熟悉吗?这 table 会一直出现在 Oracle 中吗?
我认为如果这两个问题的答案都是肯定的,那么您的方法很好,您可以使用 SQLPLUS 在很大程度上自定义 table 输出,包括调整行大小和页面大小。
但是,如果数据可能会移出 Oracle,您可能想尝试更通用的方法。像一个简单的 JDBC 程序(如果你喜欢 java)或你最喜欢的脚本语言中的类似东西,可以让你轻松地将数据结构化为转储文件所需的格式。
或者,如果您的团队中有最喜欢的 ETL 工具,您可能希望使用它。
简短的回答视情况而定 - 这可能就是为什么有人不赞成你的问题。
我不确定 SQL*Plus 配置元素是否会导致输出出现问题——如果是,请提出第二个问题。
您可以探索的一种方法是使用 DBMS_Scheduler-driven PL/SQL 程序用 UTL_FILE 写出数据。如果您认为导出过程是数据库功能的一部分,那么这将是一个不错的选择。
我还想知道你想用这些数据做什么?单独导出的数据仅使用磁盘 space.
您要将其导入另一个系统吗?如果是这样,从该系统连接到数据库并使用 SQL 提取数据会更稳健,因为将数据写入磁盘总是充满了有关日期格式的问题,数据中是否存在 CR LF,数字格式等
您可以尝试在 SQL 中使用此方法,另外:
test@ORADEV> set feed off markup html on spool on
test@ORADEV> spool 'c:\test.xls'
<br>
test@ORADEV> select 1 from dual; -- or any other query/queries
...
test@ORADEV> spool off
<br>
test@ORADEV> 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 驱动程序...