Btitle在Oracle报告中重复了不止一次

时间:2014-09-09 16:10:45

标签: sql oracle reporting

我正在做这样的报告:

alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS';
TTITLE CENTER 'Test_Repo' SKIP 1 -
CENTER ==================== SKIP 1 LEFT 'Report' -
RIGHT 'Data: &_DATE' SKIP 2
BTitle Center 'End of Report' SKIP 2 -
       left 'end of date: &_DATE' -

drop table if exists 'Test_Repo';

create table Test_Repo nologging pctfree 0 parallel as
select id, status from table_1 where order like '721044%';

spool /tests/report.csv;

select ID || ';' || STATUS as "ID;STATUS" from Test_Repo;

spool off;

EXIT;

每个csv文件中的输出都不止一个。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果您的报告跨越多个页面,则会获得多个标题集。默认页面大小仅为24,因此如果您获得的行数超过少数,则会看到重复的标题。您可以set pagesize 0使页面大小无限制;但是你失去了所有的标题和头衔。或者您可以set pagesize <some big number>,但如果它太大,那么您会在数据和底部标题之间出现空白。

将纯文本报表标题元素与数据的分隔值格式混合有点奇怪,但如果您真的想要,则要么必须为pagesize选择一个大数字,要么先计算它用替换变量技巧:

set termout off
column x_pagesize new_value y_pagesize
select count(*) + 10 as x_pagesize
from (<your original query>);
set termout on

set pagesize &y_pagesize

...但这显然涉及两次运行您的查询,这可能太昂贵(或太慢)。

我能想到的唯一其他方法是set pagesize 0,然后自己手动生成标题,如果您不想手动执行布局,请使用lpad()计算布局在线大小(默认为80):

set pagesize 0
set tab off
set verify off
set feedback off

define page_width=80

define title_1='Test_Repo'
define title_2='===================='
define title_3a='Report'
define title_3b='Data: '
define title_4='End of Report'
define title_5='end of date: '

spool /tests/report.csv;

prompt
select lpad(' ', round((&page_width - length('&title_1'))/2))
  || '&title_1' from dual;
select lpad(' ', round((&page_width - length('&title_2'))/2))
  || '&title_2' from dual;
select '&title_3a'
  || lpad(' ', &page_width - (length('&title_3a') + length('&title_3b') + 20))
  || '&title_3b' || to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') from dual;
prompt

prompt ID;STATUS

select ID || ';' || STATUS as "ID;STATUS" from Test_Repo;

prompt
select lpad(' ', round((&page_width - length('&title_4'))/2))
  || '&title_4' from dual;
prompt
select '&title_5' || to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') from dual;

spool off;

prompt ID;STATUS行会显示您的列标题,当页面大小为零时也不会显示。

这似乎与原始SQL * Plus命令生成相同的假ttitle和btitle。

您还可以使用prompt来显示标题,但为了保留您需要将它们用引号括起来的间距,您可能不希望看到它们。虽然这取决于谁或将要看到什么,我想。

您可能还想set trimout onset termout offset trimspool off。但那些都是细节......