SQL行和标头中断问题

SQL行和标头中断问题,sql,oracle,csv,Sql,Oracle,Csv,我有一个17列的表格。根据这个表,我需要从远程数据库生成一个本地CSV文件。我定义了一些set语句,只显示一次列名,不显示sql横幅、行计数和其他一些 "my sql connection"<<EOF>> test_file.csv SET TAB OFF ECHO OFF FEEDBACK OFF LINESIZE 5000 SQLPROMPT '' TRIMSPOOL OFF HEADING OFF UNDERLINE OFF PAGESIZE 0 select

我有一个17列的表格。根据这个表,我需要从远程数据库生成一个本地CSV文件。我定义了一些set语句,只显示一次列名,不显示sql横幅、行计数和其他一些

 "my sql connection"<<EOF>> test_file.csv
 SET TAB OFF ECHO OFF FEEDBACK OFF LINESIZE 5000 SQLPROMPT '' TRIMSPOOL OFF HEADING OFF UNDERLINE OFF PAGESIZE 0
 select * from my_table where ROWNUM <= 50;
 exit
 EOF
很简单,对吧


我面临着与记录线和头球突破有关的问题。即使使用LINESIZE 5000,当我打开我的csv文件时,它们都已损坏,而且我的标题也已损坏

我建议采用以下方法来使用17列节省一些时间。我想你会想用'作为分隔符

因此,首先您可以生成命令本身,我正在使用query to USER_表,但是您可以轻松地修改查询以满足您的需要

set pagesize 0
set linesize 5000
set trimspool on
(select q'!"my sql connection"<<EOF>> test_file.csv
 SET TAB OFF ECHO OFF FEEDBACK OFF LINESIZE 5000 SQLPROMPT '' TRIMSPOOL OFF HEADING OFF UNDERLINE OFF PAGESIZE 0!' from dual)
 union all
(select 
  q'!select '!' ||
  listagg(column_name, ',') within group (order by table_name) 
  || q'!' from dual union all!'
  header
from all_tab_cols where table_name =
-- MODIFY TO YOUR TABLE NAME HERE [1]:
'USER_TABLES'
)
union all
(select 
  'select ' ||
  listagg(column_name, q'! || ',' || !') within group (order by table_name) 
-- REPLACE USER_TABLES TO YOUR TABLE NAME HERE [2]:
|| ' from user_tables where rownum <= 50;'
  cmd
from all_tab_cols where table_name =
-- MODIFY USER_TABLES TO YOUR TABLE HERE [3]:
'USER_TABLES'
)
union all
(select 'exit
 EOF' from dual);
您可以测试此查询,然后在[1]、[2]、[3]行后面的三个位置用自己的表名替换USER_表

之后,获取SQL*Plus结果,当您运行is时,您应该会得到预期的结果


希望能有所帮助。

在SQL*Plus中,使用select*甚至选择特定的列都不会得到CSV输出。SQLcl和SQLDeveloper可以选择这样做。您可以更改colsep,但随后会出现大量空白。行的最大长度是多少?隐式数字/数据转换的所有列的总大小?您是否在同一个操作系统上运行和打开文件-可能您看到断线问题,具体取决于您打开文件的方式?有带换行符的值吗?当然,举个例子会有所帮助。