2017-05-10 4 views
0

Ich möchte eine PL/SQL-Funktion erstellen, die formatierten HTML-Tabelleninhalt von bestimmten SQL-Abfrage zurückgibt. Die SQL-Eingabeabfrage könnte eine andere Anzahl von Spalten haben. Also, wenn ich die Abfrage wie SELECT x,y,z FROM mytable senden, sollte meine Funktion eine Tabelle mit drei Spalten (und viele Zeilen) zurückgeben.Dynamische Anzahl von Spalten in SQL-Abfrage in PL/SQL

Um eine formatierte Tabelle zu erstellen, muss ich verschiedene Spalten durchlaufen und HTML-Zeilen (TR) mit Zellen (TD) ausfüllen. Wie finde ich die dynamische Anzahl der Spalten in der angegebenen SQL-Abfrage?

+0

Warum brauchen Sie das Orakel, um das zu tun? Wenn Sie HTML als endgültige Ausgabe bereitstellen, lassen Sie dies von Ihrer Anwendungsebene verarbeiten. Wenn der Ergebnissatz eines Datenbanktreibers einmal zurückgegeben wird, können Sie die Anzahl der abgerufenen Spalten problemlos ermitteln. –

+0

Dank @JorgeCampos, ich weiß, dass und unter normalen Umständen, würde meine Anwendungsebene tun, aber hier muss ich Batch-Job erstellen, die (mit UTIL_MAIL) eine E-Mail mit Ergebnissen senden und ich möchte diesen Inhalt als HTML formatiert werden . – sbrbot

Antwort

0

PLSQL bereitgestellt Formatierung. Mit dbms_xmlgen und xlt transform.

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

Danke @Arkadiusz Łukasiewicz, ich habe gerade kleineren Fehler bearbeitet '' geht nach '' in Ihrem XSLT. – sbrbot

0

in SQL * Plus Sie verwenden:

set markup HTML ON entmap off 

Ich glaube, es HTML ist durch eine Standard-Oracle PL/SQL-Paket Methode

Verwandte Themen