PL / SQL中SQL查询中的动态列数

时间:2017-05-10 12:40:42

标签: sql oracle plsql

我想创建一个PL / SQL函数,它将从给定的SQL查询返回格式化的HTML表格内容。 SQL输入查询可以具有不同数量的列。因此,如果我发送像SELECT x,y,z FROM mytable这样的查询,我的函数应该返回一个包含三列(和多行)的表。

为了构建格式化的表,我必须遍历不同数量的列并用单元格(TD)填充HTML行(TR)。如何在给定的SQL查询中查找动态列数!?

2 个答案:

答案 0 :(得分:0)

在SQL * Plus中使用:

set markup HTML ON entmap off

我相信标准的Oracle PL / SQL包提供HTML格式

答案 1 :(得分:0)

PLSQL方法。使用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;
   /