create or replace package cux_html_report as function t(p_size in number, p_content in varchar2) return varchar2 ; type c_sql is ref cursor; procedure main; procedure html_header(p_title in varchar2); procedure html_body(p_sql in varchar2,p_column_count in number,p_subtitle in varchar2,p_align in varchar2,p_black in varchar2); procedure html_tail; procedure table_h(p_width in number,p_border in number,p_align in varchar2); procedure table_t; procedure tr_(p_col_count in number,p_column in varchar2,p_align in varchar2,p_black in varchar2); procedure tr_h; procedure tr_t; procedure td_(p_col_count in number,p_content in varchar2,p_align in varchar2,p_black in varchar2); procedure report_header(p_title in varchar2); procedure report_subtitle(p_col_count in number,p_content in varchar2,p_align in varchar2,p_black in varchar2); procedure report_tail(p_content in varchar2);end ;/create or replace package body cux_html_report as function t(p_size in number, p_content in varchar2) return varchar2 as i number:=0; v_out varchar2(300):=''; p_cont varchar2(1000):=p_content; begin for ii in 1..p_size loop select substr(p_cont,0,decode(instr(p_cont,';'),0,length(p_cont),instr(p_cont,';')-1)) into v_out from dual ; p_cont:=substr(p_cont,instr(p_cont,';')+1); i:=i+1; if i=p_size then return v_out; end if; end loop; end ; /******************************************************************************* 主程序 需要處理分頁的問題 ********************************************************************************/ procedure main as begin html_header('我的測試報表'); report_header('我的標題'); html_body('select t.owner||'';''||t.object_name||'';''||t.object_id||'';''||t.object_type||'';''||t.owner from all_objects t where t.owner=''DINYA'' and rownum<=100',5,'序號;對象名稱;ID;類型','center',''); report_tail('這里是報表尾'); html_tail; end; --頁頭,固定格式 procedure html_header(p_title in varchar2) as begin htp.p(' '||nvl(trim(p_title),'無標題文檔')||' '); end ; --頁體, 根據SQL程序和字段數,展示數據 procedure html_body(p_sql in varchar2,p_column_count in number,p_subtitle in varchar2,p_align in varchar2,p_black in varchar2) as i number:=0; c c_sql; v_column varchar2(4000); begin table_h(90,1,'center'); report_subtitle(p_column_count,p_subtitle,p_align,p_black); open c for p_sql; loop fetch c into v_column; exit when c%notfound; i:=i+1; tr_(p_column_count,v_column,'left',''); end loop; table_t; end ; --頁尾, 固定內容 procedure html_tail as begin htp.p(' '); end ; -------------------------------------------------------------------------------- --表頭, 表的屬性 procedure table_h(p_width in number,p_border in number,p_align in varchar2) as begin htp.p(''); end ; --表尾 procedure table_t as begin htp.p(' '); end ; -------------------------------------------------------------------------------- --表格行 -------------------------------------------------------------------------------- procedure tr_(p_col_count in number,p_column in varchar2,p_align in varchar2,p_black in varchar2) as begin htp.p(''); td_(p_col_count,p_column,p_align,p_black); htp.p(' '); end; procedure tr_h as begin htp.p(''); end ; procedure tr_t as begin htp.p(' '); end ; ------------------------------------------------------------------------------- --表單元格 ------------------------------------------------------------------------------- procedure td_(p_col_count in number,p_content in varchar2,p_align in varchar2,p_black in varchar2) as v_cont varchar2(300):=p_content; v_out varchar2(300):=''; begin for i in 1..p_col_count loop select substr(v_cont,0,decode(instr(v_cont,';'),0,length(v_cont),instr(v_cont,';')-1)) into v_out from dual ; htp.p(''||substr(p_black,1,3)||v_out||substr(p_black,4)||' | '); v_cont:=substr(v_cont,instr(v_cont,';')+1); end loop; end ; ------------------------------------------------------------------------------ --報表內容部分 ----------------------------------------------------------------------------- procedure report_header(p_title in varchar2) as begin table_h(90,0,'center'); tr_(1,p_title,'center',''); table_t; end ; procedure report_subtitle(p_col_count in number,p_content in varchar2,p_align in varchar2,p_black in varchar2) as begin tr_h; td_(p_col_count,p_content,p_align,p_black); tr_t; end ; procedure report_tail(p_content in varchar2) as begin table_h(90,0,'center'); tr_(1,p_content,'left',''); table_t; end; ---------------------------------------------------------------------------------- end ;/ SQL> @d:cux_html_report.pckPackage created.Package body created.SQL> |