2017-06-28 36 views
0

我有17列的表。基于这个表我需要从远程数据库生成一个本地的CSV文件。我定义了一些设置语句来显示列名只有一次,没有sql横幅,行数和其他一些。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

你不会得到CSV输出与'选择*',甚至选择特定列这是最好无论如何,在SQL \ * Plus中。 (SQLcl和SQL Developer有选项可以做到这一点)。你可以改变'colsep',但是你会得到一个空白的负载。线的最大长度是多少? - 所有列的总大小(隐式数/数据转换)?你是否在同一个操作系统上运行并打开文件 - 也许你会看到换行符问题,具体取决于你打开它的内容吗?你有价值与换行符?当然,举例说明会有所帮助。 –

回答

0

我建议以下办法(使用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导致,当你运行是你应该得到预期的结果。

希望它有帮助。