我有一个包含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文件时,它们都被破坏了我的标题也是
答案 0 :(得分:0)
我建议采用以下方法(使用17列节省一些时间)。我想你想要&#39;作为分隔符。
首先你可以自己生成命令(我使用查询到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]行之后)将USER_TABLES替换为您自己的表名。
之后取SQL * Plus结果,当你运行时,你应该得到预期的结果。
希望它有所帮助。