我有很多数据需要假脱机到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
提前致谢
答案 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