在sqlplus中使用spool创建头文件时遇到问题

时间:2015-08-05 14:16:43

标签: sql oracle sqlplus

我有很多数据需要假脱机到csv文件。我需要set heading off所以标题不会重复每一页。但是,我仍然需要我生成的文件包含标题。有没有办法将一行标题(不是表本身)添加到查询中,在假脱机时实际上不会被视为标题?这是我的代码,它只是在我set heading off时不包含标题。

 select a.col1 as name1, 
        a.col2 as name2, 
        b.col3 as name3
from tab1 a, 
     tab2 b

提前致谢

3 个答案:

答案 0 :(得分:3)

你可以尝试这样的事情:

set heading off;

select 'NAME1' name1, 'NAME2' name2, 'NAME3' name3 from dual
union all
select a.col1 as name1, a.col2 as name2, b.col3 as name3
from tab1 a, tab2 b
where <join condition>;

ETA:如果主查询返回的列类型不是所有字符串,则必须显式转换它们。这是一个例子:

create table test1 (col1 number,
                    col2 date,
                    col3 varchar2(10),
                    col4 clob);

insert into test1 values (1, sysdate, 'hello', 'hello');

commit;

select 'col1' col1, 'col2' col2, 'col3' col3, 'col4' col4 from dual
union all
select col1, col2, col3, col4
from   test1;
       *
Error at line 1
ORA-01790: expression must have same datatype as corresponding expression

set heading off;

select 'col1' col1, 'col2' col2, 'col3' col3, to_clob('col4') col4 from dual
union all
select to_char(col1), to_char(col2, 'dd/mm/yyyy hh24:mi:ss'), col3, col4
from   test1;

col1                                     col2                col3       col4    
1                                        05/08/2015 11:23:15 hello      hello   

答案 1 :(得分:2)

你说你正在假脱机到CSV文件,所以大概是列间距无关紧要(你已经set colsep ,了。)

如果是这样,您可以使用the SQL*Plus prompt command伪造标题,而无需使用联合:

prompt name1,name2,name3

 select a.col1, 
        a.col2, 
        b.col3
from tab1 a, 
     tab2 b

或单独的查询,再次没有联合:

set feedback off
 select 'name1', 'name2', 'name3' from dual;
set feedback on -- optionally; probably not in this case

 select a.col1, 
        a.col2, 
        b.col3
from tab1 a, 
     tab2 b

同样,这些值不会与实际数据列对齐,但对于CSV,您并不真正关心。 (对于CSV,我通常使用逗号明确地将值连接起来,这会删除大量的空格并使文件变小)。

答案 2 :(得分:1)

你想尝试:

set pages <number of rows you expect>

E.g。

set pages 1000

另一种方式可能是UNION,如下:

SELECT 'name1', 'name2', 'name3' FROM DUAL UNION select a.col1 as name1, a.col2 as name2, b.col3 as name3 from tab1 a, tab2 b