2

代码:

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 格式的查询结果。我究竟做错了什么?

4

2 回答 2

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- 并且您不需要在 spool 文件名周围加上引号,除非它包含空格,但它们不需要伤害。

还有一个set colsep命令可用于将列分隔符设置为逗号,但您必须担心填充,因此我发现像您(几乎)那样将列连接在一起更容易。


除了 SQL*Plus,因为我没有注意到标题中的 SQL Developer 参考。假脱机在 Developer 中有点奇怪,因为它似乎捕获和回显您可能不想要的东西,并且并非所有set命令都有效(哪些命令取决于版本)。

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

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

并使用“运行”而不是“运行脚本”,以便结果出现在查询结果窗口的网格视图中。右键单击网格并选择“导出”。然后,您可以另存为 CSV,甚至是 XLS,如果您愿意,可以选择不包含标题行。

于 2013-04-09T16:27:52.490 回答
-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 才能正确执行此代码。

于 2015-04-14T18:02:54.507 回答