oracle - 在 HTML table 中,在 pl/sql过程中,包装查询或者 refcursor

  显示原文与译文双语对照的内容
0 0

如果使用SQL*Plus来使用,那么它看起来很简单


SQL> set markup html on;

在SQL*Plus窗口中得到一些漂亮的结果。 我们有一个oracle作业夜间运行,并发送一封结果的电子邮件给一些人。 我想在一个 HTML table 中包装一个sql语句以便在该消息中。 什么是最好的方法?

时间: 原作者:

0 0

一种选择是使用的超文本功能 HTF:


set define off

create table so14t (id number, data varchar2(25));

insert all
into so14t values(101, 'one hundred & one')
into so14t values(202, 'two hundred & two')
into so14t values(303, 'three hundred & three')
select 1 from dual;

declare
 v_html varchar2(32767);
begin
 v_html := htf.tableopen;

 for i in (select * from so14t) loop
 v_html := v_html || htf.tablerowopen;
 v_html := v_html || htf.tabledata(i.id);
 v_html := v_html || htf.tabledata(htf.escape_sc(i.data));
 v_html := v_html || htf.tablerowclose;
 end loop;

 v_html := v_html || htf.tableclose;

 dbms_output.put_line(v_html);
end;
/

打印( 为可读性设置格式):


<TABLE> <TR><TD>101</TD><TD>one hundred &amp; one</TD></TR>
 <TR><TD>202</TD><TD>two hundred &amp; two</TD></TR>
 <TR><TD>303</TD><TD>three hundred &amp; three</TD></TR></TABLE>

原作者:
0 0

站点上的that上发布,我接近了我正在寻找的答案。Kyte有一个很棒的博客帖子,它的功能与我希望的完全一样。 简而言之,这就是我所实现的:

我创建了一个将sys_refcursor作为变量的函数:


CREATE OR REPLACE FUNCTION fncRefCursor2HTML(rf SYS_REFCURSOR) RETURN CLOB
IS
 lRetVal CLOB;
 lHTMLOutput XMLType; 
 lXSL CLOB;
 lXMLData XMLType;

 lContext DBMS_XMLGEN.CTXHANDLE;
BEGIN
 -- get a handle on the ref cursor --
 lContext := DBMS_XMLGEN.NEWCONTEXT(rf);
 -- setNullHandling to 1 (or 2) to allow null columns to be displayed --
 DBMS_XMLGEN.setNullHandling(lContext,1);
 -- create XML from ref cursor --
 lXMLData := DBMS_XMLGEN.GETXMLTYPE(lContext,DBMS_XMLGEN.NONE);

 -- this is a generic XSL for Oracle's default XML row and rowset tags --
 --"" is a non-breaking space --
 lXSL := lXSL || q'[<?xml version="1.0" encoding="ISO-8859-1"?>]';
 lXSL := lXSL || q'[<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">]';
 lXSL := lXSL || q'[ <xsl:output method="html"/>]';
 lXSL := lXSL || q'[ <xsl:template match="/">]';
 lXSL := lXSL || q'[ <html>]';
 lXSL := lXSL || q'[ <body>]';
 lXSL := lXSL || q'[ <table border="1">]';
 lXSL := lXSL || q'[ <tr bgcolor="cyan">]';
 lXSL := lXSL || q'[ <xsl:for-each select="/ROWSET/ROW[1]/*">]';
 lXSL := lXSL || q'[ <th><xsl:value-of select="name()"/></th>]';
 lXSL := lXSL || q'[ </xsl:for-each>]';
 lXSL := lXSL || q'[ </tr>]';
 lXSL := lXSL || q'[ <xsl:for-each select="/ROWSET/*">]';
 lXSL := lXSL || q'[ <tr>]'; 
 lXSL := lXSL || q'[ <xsl:for-each select="./*">]';
 lXSL := lXSL || q'[ <td><xsl:value-of select="text()"/> </td>]';
 lXSL := lXSL || q'[ </xsl:for-each>]';
 lXSL := lXSL || q'[ </tr>]';
 lXSL := lXSL || q'[ </xsl:for-each>]';
 lXSL := lXSL || q'[ </table>]';
 lXSL := lXSL || q'[ </body>]';
 lXSL := lXSL || q'[ </html>]';
 lXSL := lXSL || q'[ </xsl:template>]';
 lXSL := lXSL || q'[</xsl:stylesheet>]';

 -- XSL transformation to convert XML to HTML --
 lHTMLOutput := lXMLData.transform(XMLType(lXSL));
 -- convert XMLType to Clob --
 lRetVal := lHTMLOutput.getClobVal();

 RETURN lRetVal;
END;

然后在 pl/sql开发人员的测试窗口中测试它


declare 
 l_cursor sys_refcursor;
begin
 open l_cursor for select * from employees;
 :x:= fncRefCursor2HTML(l_cursor);
 close l_cursor; 
end;

这是我一直希望找到的东西。 谢谢汤姆 Kyte !

原作者:
...