2017-05-10 28 views
0

我想創建一個PL/SQL函數,它將從給定的SQL查詢中返回格式化的HTML表格內容。 SQL輸入查詢可能有不同數量的列。所以如果我發送像SELECT x,y,z FROM mytable這樣的查詢,我的函數應該返回一個有三列(和許多行)的表。PL/SQL中SQL查詢的動態列數

爲了建立格式化表格,我必須遍歷不同數量的列,並用單元格(TD)填充HTML行(TR)。如何在給定的SQL查詢中查找列的動態數量!?

+0

爲什麼你需要oracle來做到這一點?如果您將HTML作爲最終輸出提供,請讓您的應用程序層處理此問題。任何返回結果集的數據庫驅動程序都可以輕鬆地爲您提供獲取列的數量。 –

+0

謝謝@JorgeCampos,我知道,並且在正常情況下會執行我的應用程序層,但在這裏我需要創建批量作業,它將發送(使用UTIL_MAIL)帶結果的電子郵件,並且希望將此內容格式化爲HTML 。 – sbrbot

回答

0

PLSQL方法提供格式化的HTML。用dbms_xmlgen和xlt轉換。

DECLARE 
    v_ctx dbms_xmlgen.ctxHandle; 
    v_query varchar2(2000) := 'SELECT * FROM user_objects WHERE rownum < 10';  -- your query here 
    v_xsl_transform xmltype := xmltype('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html"/> 
    <xsl:template match="/ROWSET"> 
    <table border="1"> 
     <tr> 
     <xsl:for-each select="ROW[1]/*"> 
     <td><xsl:value-of select="name()"/></td> 
     </xsl:for-each> 
     </tr> 
     <xsl:apply-templates/> 
    </table> 
    </xsl:template> 
    <xsl:template match="ROW"> 
    <tr><xsl:apply-templates/></tr> 
    </xsl:template> 
    <xsl:template match="ROW/*"> 
    <td><xsl:value-of select="."/></td> 
    </xsl:template> 
    </xsl:stylesheet>'); 


    v_html clob; 
    BEGIN 
    v_ctx := dbms_xmlgen.newContext(v_query); 
    dbms_xmlgen.setNullHandling(v_ctx, dbms_xmlgen.EMPTY_TAG); 
    dbms_xmlgen.setXSLT(v_ctx, v_xsl_transform);   
    select xmlserialize(document dbms_xmlgen.getXMLType(v_ctx) as clob indent size =4) into v_html from dual; 
    dbms_xmlgen.closeContext(v_ctx); 
    dbms_output.put_line(v_html); 
    END; 
/
+0

謝謝@ArkadiuszŁukasiewicz,我剛剛編輯了更小的錯誤''在XSLT中的''之後。 – sbrbot

0

在SQL * Plus使用:

set markup HTML ON entmap off 

我相信這是一個標準的Oracle PL/SQL包