SQL线路和标头打破了问题



我有一个带有17列的表。基于此表,我需要从远程数据库生成本地CSV文件。我将一些设置的语句定义以显示一次列名,没有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

简单,对吗?

我面临的问题与记录线和标头断路有关。即使我打开CSV文件时,也有5000行,它们都被打破了,我的标题也

我建议以下方法(使用17列节省一些时间(。我想你想要'作为定界符。

因此,首先您可以生成命令本身(我正在使用Query to user_tables,但您可以轻松地修改查询以满足您的需求(

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]行(。

之后,以SQL*Plus结果,当您运行时,您应该获得预期的结果。

希望它有帮助。

最新更新