`

使用sqlplus生成txt或者html报表

阅读更多
使用sqlplus生成txt报表
需求:通过在数据库上跑脚本来生成txt文件的报表(csv格式),使用逗号隔开每一项内容
使用sqlplus的spool来实现
下面列出调试成功的sql.(scott下的emp表)
在sql提示符下面输入@此文件名.sql来调用,在当前文件夹下生成report.txt文件
注:如果直接复制此内容到sql窗口中执行会导致生成的报表文件中出现其他废字符,需要手动修改,所以建议使用上面的方法

-- 关闭输出(避免产生不需要的数据)
set echo off
-- 在sql文件所在文件夹生成emp.txt文件
spool  emp.txt
-- 关闭回显本次sql命令处理的记录条数
set feedback off
-- 每行最大字符数3000
set linesize 3000
-- 每页行数
set pagesize 0
-- sql命令前的提示
set sqlprompt ''
-- 去除重定向(spool)输出每行的拖尾空格 默认为off
set trimspool on
select '员工号' || ','
       || '员工姓名' || ','
       || '工作' || ','
       || '部门经理' || ','
       || '参加工作日期' || ','
       || '工资' || ','
       || '奖金' || ','
       || '部门编号'
       from dual
union all
select empno || ','
       || ename || ','
       || job || ','
       || mgr || ','
       || to_char(hiredate,'yyyy-MM-dd') || ','
       || sal || ','
       || comm || ','
       || deptno
  from emp;
spool off
-- 下面依次还原设置的参数到默认设置
set echo on
set feedback on
set linesize 100
set pagesize 24
set sqlprompt SQL>
set trimspool off



spool常用的设置

set colsep',';       //域输出分隔符
set echo off;        //显示脚本中的每个sql命令,缺省为on
set feedback off;  //回显本次sql命令处理的记录条数,缺省为on
set heading off;   //输出域标题,缺省为on
set pagesize 0;   //输出每页行数,缺省为24,为了避免分页,可设定为0。
set termout off;   //显示脚本中的命令的执行结果,缺省为on
set trimout on;   //去除标准输出每行的拖尾空格,缺省为off
set trimspool on;  //去除重定向(spool)输出每行的拖尾空格,缺省为off

导出文本数据的建议格式: SQL*PLUS环境设置
set echo off
set feedback off
set linesize 3000
set pagesize 0
set sqlprompt ''
set trimspool on

注:LINESIZE要稍微设置大些,免得数据被截断,它应和相应的TRIMSPOOL结合使用防止导出的文本有太多的尾部空格。
   如果LINESIZE设置太大,会大大降低导出的速度


使用sqlplus生成html报表
通过在数据库上跑脚本来生成html文件的报表,使用html标记来显示内容

解决:只需要在刚刚的sql中加入下面一行即可实现此需求:
SET MARKUP HTML ON
优化:可以改变sql来增强效果:

select '员工号' ,
       '员工姓名' ,
       '工作' ,
       '部门经理' ,
       '参加工作日期' ,
       '工资' ,
       '奖金' ,
       '部门编号'
       from dual
union all
select to_char(empno) ,
       ename ,
       job ,
       to_char(mgr) ,
       to_char(hiredate,'yyyy-MM-dd') ,
       to_char(sal) ,
       to_char(comm) ,
       to_char(deptno)
  from emp;

注:附件内容
   csvreport.sql 生成csv文件格式的报表
   htmlreport.sql生成html文件格式的报表

关于小数字段的精度丢失解决...
在涉及到带小数的字段的时候,如果为.00的情况会丢失精度
解决方法:
trim(to_char(sal,'99999999999999.99'))
注:上面的99999999999999.99串是自定义的,请根据字段的大小酌情定义其长度
但是这个方法有个小问题,当值为0.00的时候,转换出来的字符串为:.00
当前还没有什么好点的办法来解决这个问题,把9改成0的话是可以,但前面会用0来替代空格,这样的话反而实现不了需求....
如果不考虑效率,可以用case处理下为0.00的情况
如下:
(case comm when 0.00 then '0.00' else trim(to_char(comm,'99999999999999.99')) end)
2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics