我有一个带有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结果,当您运行时,您应该获得预期的结果。
希望它有帮助。