web-dev-qa-db-ja.com

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

あなたが使用するためにSQL * Plusを使用している場合、それは本当に簡単に思えます

SQL> set markup html on;

sQL * Plusウィンドウに素敵な結果が表示されます。私たちは夜間に実行され、結果の電子メールを多数の人々に送信するOracleジョブがあります。そのメッセージに含まれるように、SQLステートメントをHTMLテーブルでラップします。それを行う最良の方法は何ですか?

2
Lloyd

dbms_xmlgen を使用してxmlを生成することができます。例:

select dbms_xmlgen.getxml('select * from dual') as xml from dual;

XML
---
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <DUMMY>X</DUMMY>
 </ROW>
</ROWSET>

代わりに getxmltype を使用すると、おそらく次のようにxslt変換を適用できます。

select dbms_xmlgen.getxmltype('select * from dual').transform(XMLType(
'<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
  <body>
   <table border="1">
     <tr bgcolor="cyan">
      <xsl:for-each select="/ROWSET/ROW[1]/*">
       <th><xsl:value-of select="name()"/></th>
      </xsl:for-each>
     </tr>
     <xsl:for-each select="/ROWSET/*">
      <tr>
       <xsl:for-each select="./*">
        <td><xsl:value-of select="text()"/> </td>
       </xsl:for-each>
      </tr>
     </xsl:for-each>
   </table>
   </body>
</html>
  </xsl:template>
</xsl:stylesheet>')).getclobval() as html from dual;

HTML
----
<html>
<body>
<table border="1">
<tr bgcolor="cyan">
<th>DUMMY</th>
</tr>
<tr>
<td>X</td>
</tr>
</table>
</body>
</html>

xsltのTom Kyteへのnbクレジット 彼のブログから 。もう少し高度なバージョンについては this other post も参照してください。