В процедуре PL / SQL оберните запрос или рефкурсор в таблицу HTML - PullRequest
5 голосов
/ 12 октября 2011

Это кажется действительно простым, если вы используете SQL * Plus, чтобы использовать

SQL> set markup html on;

и получить прекрасные результаты в окне SQL * Plus.у нас есть работа оракула, которая выполняется в одночасье и отправляет результаты по электронной почте ряду людей.Я хотел бы обернуть оператор SQL в таблицу HTML, чтобы быть в этом сообщении.Каков наилучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 13 октября 2011

От публикации более На сайте DBA Я подошел к ответу, который искал. У Тома Кайта есть отличное сообщение в блоге с функцией, которая делает именно то, на что я надеялся. Короче вот что я реализовал:

Я создал функцию, которая приняла 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 Developer

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

Это то, что я надеялся найти в течение долгого времени. СПАСИБО Том Кайт!

2 голосов
/ 13 октября 2011

Один из вариантов - использовать гипертекстовые функции 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...