我建议以下办法(使用17列节省一些时间)。我想你会想'作为分隔符。
所以首先您可以生成命令本身(我使用的查询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);
您可以测试该查询,然后将其替换USER_TABLES你在三个地方拥有自己的表名(在[1],[2],[3]行之后)。
之后采取的SQL * Plus导致,当你运行是你应该得到预期的结果。
希望它有帮助。
你不会得到CSV输出与'选择*',甚至选择特定列这是最好无论如何,在SQL \ * Plus中。 (SQLcl和SQL Developer有选项可以做到这一点)。你可以改变'colsep',但是你会得到一个空白的负载。线的最大长度是多少? - 所有列的总大小(隐式数/数据转换)?你是否在同一个操作系统上运行并打开文件 - 也许你会看到换行符问题,具体取决于你打开它的内容吗?你有价值与换行符?当然,举例说明会有所帮助。 –