sql >> データベース >  >> RDS >> Oracle

PL / SQLプロシージャ内で、クエリまたはリフレクタをHTMLテーブルでラップします。

    DBAサイト 探していた答えに近づきました。 TomKyteにはすばらしいブログ投稿があります 私が望んでいたことを正確に実行する機能を備えています。要するに、これが私が実装したものです:

    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 /SQLDeveloperのテストウィンドウでテストします

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

    これは私が長い間見つけたいと思っていたものです。トム・カイトに感謝します!



    1. 初心者のためのSQLIN演算子

    2. TO_SECONDS()の例– MySQL

    3. PL / SQLブロックの式の変数に値を割り当てる方法は?

    4. psql(PostgreSQL)でクエリを実行するときにNull値を表示する方法