无法使用 sqlplus 将动态 Oracle table 导出为格式正确的 CSV

Unable to export dynamic Oracle table to properly formatted CSV using sqlplus

我正在尝试替代 Python/pandas 导出过程并直接从 Oracle 到 csv。我看过几个帖子,比如这个

假设我在 Oracle 中有一个包含三列的 table:ColA、ColB、ColC。我想使用一个命令行实用程序,它将 SQL 命令作为输入并生成一个 CSV 文件,该文件看起来像任何具有 header 行和值行的标准 CSV 文件:

ColA,ColB,ColC
A,B,C
D,E,F
...

在 SQL 服务器中,有一个名为 bcp 的实用程序我可以使用,如下所示:

bcp "SELECT 'ColA', 'ColB', 'ColC' UNION ALL Select ColA, ColB, ColC From 
myTable" queryout "C:\Temp\csvfiles\output.csv" -c -CRAW -S localhost -u 
my_userid -p my_password -d my_database

Easy-peasy。但是在寻找 Oracle 等价物时,就没那么多了。

我看了一下here but the author wants you to create a UTL_FILE. That doesn't seem like a possibility since this is supposed to be a completely generic process that gets built and run from Python. I took a look at sqlplus but I can't seem to come up with a way to create a typical CSV similar to bcp. The docs here也不是很清楚。这是一种常见的格式,我希望看到大量示例。

像这样的网站 here 展示了如何使用 sqlplus 输出 fixed-length CSV 但没有展示如何添加 header 行和填充值,这可能是好的,但不可取。这是我能想到的最好的结果:

set colsep ,
set headsep off
set pagesize 0
set trimspool on
set linesize 200
set numwidth 50
SET TERMOUT OFF

Spool output.csv

SELECT ColA,
    ColB,
    ColC
FROM MyTable;

Spool off
exit

那么,在 Oracle 中是否有与可信赖的 bcp 等效的 tool/command,或者是否有某个地方使用 sqlplus 的示例可以生成类似于上面的带有 header 行的 csv 和没有所有前导空格?或者是否有另一种选择从随机 Oracle tables 生成动态 CSV 文件?还是我一直在使用 Python、pyodbc 和 pandas 来获取我的 nicely-formatted CSV 文件? TIA

Oracle 的 SQLcl 实用程序(命令行可执行文件 sqlsql.exe)可以帮助您实现它。

这是下载 link SQLcl。免费。

要以 CSV 格式导出文件,您只需指定

SET SQLFORMAT CSV

如果您想要不同的分隔符,请使用

SET SQLFORMAT DELIMITED '|'

这是 header

的示例输出
SQL> select * from employees;
"EMPLOYEE_ID","FIRST_NAME","LAST_NAME","EMAIL","PHONE_NUMBER","HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID","DEPARTMENT_ID"
    198,"Donald","OConnell","DOCONNEL","650.507.9833",21-06-07,"SH_CLERK",2600,,124,50
    199,"Douglas","Grant","DGRANT","650.507.9844",13-01-08,"SH_CLERK",2600,,124,50
    200,"Jennifer","Whalen","JWHALEN","515.123.4444",17-09-03,"AD_ASST",4400,,101,10
    201,"Michael","Hartstein","MHARTSTE","515.123.5555",17-02-04,"MK_MAN",13000,,100,20
    202,"Pat","Fay","PFAY","603.123.6666",17-08-05,"MK_REP",6000,,201,20
    203,"Susan","Mavris","SMAVRIS","515.123.7777",07-06-02,"HR_REP",6500,,101,40
    204,"Hermann","Baer","HBAER","515.123.8888",07-06-02,"PR_REP",10000,,101,70
    205,"Shelley","Higgins","SHIGGINS","515.123.8080",07-06-02,"AC_MGR",12008,,101,110
    206,"William","Gietz","WGIETZ","515.123.8181",07-06-02,"AC_ACCOUNT",8300,,205,110
    100,"Steven","King","SKING","515.123.4567",17-06-03,"AD_PRES",24000,,,90
    101,"Neena","Kochhar","NKOCHHAR","515.123.4568",21-09-05,"AD_VP",17000,,100,90
    102,"Lex","De Haan","LDEHAAN","515.123.4569",13-01-01,"AD_VP",17000,,100,90
    103,"Alexander","Hunold","AHUNOLD","590.423.4567",03-01-06,"IT_PROG",9000,,102,60
    104,"Bruce","Ernst","BERNST","590.423.4568",21-05-07,"IT_PROG",6000,,103,60
    105,"David","Austin","DAUSTIN","590.423.4569",25-06-05,"IT_PROG",4800,,103,60
    106,"Valli","Pataballa","VPATABAL","590.423.4560",05-02-06,"IT_PROG",4800,,103,60
    107,"Diana","Lorentz","DLORENTZ","590.423.5567",07-02-07,"IT_PROG",4200,,103,60
    108,"Nancy","Greenberg","NGREENBE","515.124.4569",17-08-02,"FI_MGR",12008,,101,100
    109,"Daniel","Faviet","DFAVIET","515.124.4169",16-08-02,"FI_ACCOUNT",9000,,108,100

此外,所有 SQL* Plus 命令都受支持,只有少数特定于 SQLcl。看到这个 command line reference

SET MARKUP CSV ON - 在执行查询之前在 sqlplus 中使用它以获取 csv 格式的数据