如何在oracle sql developer中使用spool将select语句的结果正确导出到Csv文件中

时间:2013-04-09 16:07:35

标签: sql oracle oracle11g

代码:

set heading off
  set arraysize 1
  set newpage 0
  set pages 0
  set feedback off
  set echo off
  set verify off

spool 'c:\farmerList.csv'
/

select FIRSTNAME','LASTNAME','TRN','CELL','PARISH

spool off

文件正在保存到目录中,但它保存了“select FIRSTNAME”,“LASTNAME”,“TRN”,“CELL”,“PARISH”,而不是csv格式的查询结果。我做错了什么?

2 个答案:

答案 0 :(得分:3)

您的选择不完整,因为您没有from条款,但不确定您是否在复制粘贴中丢失了该条款。因为它没有任何东西可以运行,因为部分语句永远不会被执行(下一行没有终止;/)。如果你确实有一个from farmers;子句,它可能会显示命令加上一个ORA-00923错误。

您不能在字段之间添加引号,您需要使用||连接符号将字段与该字符连接起来:

spool 'c:\farmerList.csv'

select FIRSTNAME
    ||','|| LASTNAME
    ||','|| TRN
    ||','|| CELL
    ||','|| PARISH
from farmers;

提供包含

的文件
Joe,Grundy,X,Y,Ambridge

字段不必分开,我发现更容易阅读并跟踪逗号。

在spool命令之后你不需要/ - 它会重新执行spool之前的最后一个语句,如果有的话 - 并且你不需要周围的引号假脱机文件名,除非它包含空格,但它们不会受到伤害。

还有一个set colsep命令,您可以使用该命令将列分隔符变为逗号,但是您必须担心填充,因此我发现更容易将列连接在一起,因为您(几乎)做。


除了SQL * Plus之外,因为我没有注意到标题中的SQL Developer参考。 Spool在开发人员中有点奇怪,因为它似乎陷阱并回应你可能不想要的东西,并且并非所有set命令都有效(哪些命令取决于版本)。

我认为更安全和首选的方法是运行没有连接逗号的普通查询:

select FIRSTNAME, LASTNAME, TRN, CELL, PARISH
from farmers;

并使用'run'而不是'run script',以便结果显示在查询结果窗口的网格视图中。右键单击网格,然后选择“导出”。然后,您可以保存为CSV,甚至可以保存为XLS,如果您愿意,可以选择没有标题行。

答案 1 :(得分:-1)

这是正确的解决方案,请仔细阅读

import java.sql.*;
import java.io.*;
import au.com.bytecode.opencsv.CSVWriter;

public class TableExport {
public static void main(String[] args) {

try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","name","password");
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
ResultSet resultData = statement.executeQuery("select * from your_table");

            CSVWriter writer = new CSVWriter(new FileWriter(new File("D:/Uploads/Output5.csv")), '|');
            writer.writeAll(resultData, true);
            writer.close();

}catch (Exception e){
    System.out.println("Error" +e);
    }
  }
}

如果有人喜欢这个,请注意你需要在库文件夹中使用oracle-jdbc.jar和opencsv1.7.jar才能正确执行此代码。