在 PL/SQL 过程中,将查询或引用游标包装在 HTML 表中

2023-12-01

如果您使用 SQL*Plus 来使用,这似乎很容易

SQL> set markup html on;

并在 SQL*Plus 窗口中获得一些可爱的结果。我们有一个预言机工作,需要通宵运行,并向许多人发送结果电子邮件。我想将 sql 语句包装在 HTML 表中以包含在该消息中。最好的方法是什么?


从发帖结束在 DBA 网站上我已经接近我正在寻找的答案了。Tom Kyte 有一篇很棒的博客文章其功能完全符合我的期望。简而言之,这就是我的实现:

我创建了一个将 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/SQL Developer 的测试窗口中对其进行测试

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

这是我长期以来一直希望找到的东西。谢谢汤姆·凯特!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PL/SQL 过程中,将查询或引用游标包装在 HTML 表中 的相关文章

随机推荐

  • 当混合中有新行字符时,UITextView firstRectForRange 不起作用

    我使用此方法将 NSRange 转换为 CGRect 因为它与 UITextView 相关 CGRect frameOfTextRange NSRange range inTextView UITextView textView UITex
  • Spring Data Neo4J 存储库 findAll() 导致 nullpointerException

    我制作了一个简单的存储库 其中包含系统中的所有人员 一切似乎都工作正常 我可以根据给定的键和值添加 删除甚至检索单个人员 但由于某种原因我无法直接检索存储在存储库中的所有人员 我尝试使用 findAll 方法来完成此操作 该方法应该返回一个
  • IIS不使用用户环境变量

    我将 NET Core 应用程序部署到同一服务器两次 一次用于 QA 一次用于生产 目前 我让他们每个人都使用不同的本地用户来运行 IIS 应用程序池 并相应地将 ASPNETCORE ENVIRONMENT 变量设置为 qa 和 生产 这
  • java.lang.OutOfMemoryError:调用 Files.readAllBytes 时直接缓冲内存

    我有以下代码 旨在读取目录并将其压缩到 tar gz 存档中 当我将代码部署到服务器上并使用一批文件对其进行测试时 它在前几个测试批次中工作 但在第 4 或第 5 批次之后 它开始持续给出 java lang OutOfMemoryErro
  • 从数组中删除负数

    我有一个来自数据库的数组 它从一组元素中获取所有 id 然而 它似乎也从发生的一些后端事件中获取了一些负 ID 并且它破坏了我需要对这些 id 执行的操作 在循环数组并将其放入应用程序之前 有没有办法从数组中删除这些负 ID 在我抓住它们之
  • 使用 AVFoundation 框架 iPhone 进行视频录制?

    我正在借助示例代码开发一个应用程序2010 年全球开发者大会AVCamDemo 示例 在应用程序中 我需要从 iPhone 的前置摄像头录制视频 但由于我的地方没有新的 iPhone 4 我无法正确测试代码 如果有人能给我提示 无论我是否朝
  • 我在 pyqt5 程序中使用 QDoubleValidator 但它似乎不起作用

    我创建了一个 QWidget 对象 其中有一些 lineEdit 并且我打算向它们添加一些约束 因此我实现了 QDoubleValidator 对象 以下是我的代码中的相关部分 self lineEdit taxRate QLineEdit
  • Python 和 Selenium - 离开页面时禁用警报

    Using Python 3 and Chrome驱动程序 假设一个自动化的 Python 程序正在网上冲浪 从不同的来源获取内容 假设这些网站中的任何一个触发了 您确定要离开此页面吗 alert 关键词 any 以随机方式 这些网站 Qu
  • 结构化数据(微观数据)和嵌入项目

    我想使用 Microdata 和 Schema org 来定义我的网页的主要内容 所以我做了这样的事情 div div div div
  • 将字符串从 C# 编组到 C++

    我是微软世界的新人 我在尝试将简单的字符串从 c 传递到 dll c 时遇到很多问题 我读过很多帖子和文档 但问题是一样的 C code extern C declspec dllexport int Init long l char ur
  • 宏中的 # 和 ##

    include
  • 如何更改 UITableView Swift 3 中的分隔符高度?

    尽管关于这个主题已经有一些答案 它们都没有涵盖 Swift 3 而且它们都是很久以前的了 当前在 Swift 3 中更改 UITableView 中分隔符高度的最佳方法是什么 更新为 Swift 3 如果您想更改 UITableView 分
  • 如何在链接悬停时隐藏浏览器左下角的 url

    当我将光标悬停在链接上时 我想隐藏显示的网址 我只想在我的浏览器上这样做 网上有很多关于此的问题 但我没有找到任何可行的解决方案 我正在寻找适用于 Chrome 或 Firefox 的解决方案 为什么我需要这样做 我很快就会展示一个网站演示
  • jQuery 如果在页面上找到此图像,请添加此元标记?

    我正在尝试将丰富的片段添加到显示星星的动态图像中 我的购物车写的唯一内容就是这个图像 所以我必须找到正在显示的图像 然后添加正确的元标记 因此 如果显示的图像是 1stars gif 我必须写 如果显示的图像是 5stars gif 我必须
  • 如何按列删除所有具有“NA”值的单元格

    这个问题不是重复的 因为我的data frame 没有相同数量的NA values在所有列中 因此该问题中提到的解决方案不起作用 我有一个data frame与很多NA值 我想删除所有具有 NA 值的单元格 重要 不是行或列 单元格 原来的
  • 如何将 URI 传递给意图?

    我正在尝试将 URI 对象传递给我的 Intent 以便使用该 URI 在另一项活动中 如何传递 URI private Uri imageUri Intent intent new Intent this GoogleActivity c
  • GPS计算Windows Phone 7上两点之间的距离

    我正在使用 GPS 来计算两点之间的距离 即我使用 Windows Phone 作为卷尺 但当我开始时 我实际上没有得到正确的值 即使我站着不动 它也给了我数百米 这是我的代码 myWatcher StatusChanged new Eve
  • 响应多个KeyDown事件

    我正在制作一个简单的 WinForm 赛车游戏 我有两个对象 汽车 当按下按键时它们在表单上移动 Form1KeyDown Event 唯一的问题是 当一个玩家按下一个键时 另一个玩家无法按下他的键 什么也不会发生 但是当第一个玩家释放钥匙
  • 嵌套的 RecyclerView 不滚动

    我在另一个回收器视图中添加回收器视图时遇到问题 子回收器位于 CardView 内 而 CardView 位于父回收器视图内 我尝试了互联网上的所有解决方案 但没有用 我希望子回收器视图垂直滚动 而父回收器视图也垂直滚动 父级回收者视图
  • 在 PL/SQL 过程中,将查询或引用游标包装在 HTML 表中

    如果您使用 SQL Plus 来使用 这似乎很容易 SQL gt set markup html on 并在 SQL Plus 窗口中获得一些可爱的结果 我们有一个预言机工作 需要通宵运行 并向许多人发送结果电子邮件 我想将 sql 语句包