串联问题 - 使用 html 和 SYS_REFCURSOR 的 Oracle 电子邮件

Issue in concatenation - Oracle Email using html and SYS_REFCURSOR

我是 oracle 的新手,正在尝试使用 UTL_MAIL.SEND 发送邮件。我在两者之间使用 HTML 来创建 table 和所有。使用 CLOB 变量存储 HTMLSYS_REFCURSOR 存储查询结果。在查询中尝试使用循环从 SYS_REFCURSOR 获取数据。所有结构都很好,但是 HTML table 中的值,即从 SYS_REFCURSOR 中获取的两个散列 (#) 附加到最后一个值。我的查询如下。

DECLARE postComments SYS_REFCURSOR;
v_Message CLOB;

liscname DAN_DANAPP_TRADE_LIC.OTL_LIC_NAME%TYPE;

lisctype DAN_DANAPP_TRADE_LIC.OTL_LIC_TYPE%TYPE;

authority DAN_DANAPP_TRADE_LIC.OTL_LIC_AUTH%TYPE;

lastdate DAN_DANAPP_TRADE_LIC.OTL_EXPIRY_DT%TYPE;

daysrem number;

BEGIN OPEN postComments
FOR
SELECT otl.OTL_LIC_NAME,
       otl.OTL_LIC_TYPE,
       otl.OTL_LIC_AUTH,
       to_char(to_date(otl.OTL_EXPIRY_DT,'DD/MM/YYYY')) AS expirydate,
       to_date(otl.OTL_EXPIRY_DT,'dd/mm/yyyy')-to_date(sysdate,'dd/mm/yyyy') AS daystoexpire
FROM DAN_DANAPP_TRADE_LIC otl
WHERE OTL_EFF_TO_DT IS NULL
  AND (to_date(otl.OTL_EXPIRY_DT,'dd/mm/yyyy')-to_date(sysdate,'dd/mm/yyyy'))<=45
  AND OTL_CLO_STATUS=0
ORDER BY (to_date(otl.OTL_EXPIRY_DT,'dd/mm/yyyy')-to_date(sysdate,'dd/mm/yyyy')) DESC;

v_Message := q'#<html>
<body>Dear Sir/Madam,<br><br>
The following trade license(s) will expire soon. Please followup accordingly.
<br><br>
<table border="1"  width="90%">
<tr>
<th>
Company
</th>
<th>
License Type
</th>
<th>
Licensing Authority
</th>
<th>
Expiry Date
</th>
<th>
Days Left
</th>
</tr>#';

LOOP FETCH postComments INTO liscname,
                             lisctype,
                             authority,
                             lastdate,
                             daysrem;

EXIT WHEN postComments%NOTFOUND; --  dbms_output.put_line(liscname);

dbms_lob.append(v_Message, q'#<tr><td>#'|| liscname || q'#</td> 
<td>#'|| lisctype || q'#</td>
<td>#'|| authority || q'#</td>
<td>#'|| lastdate || q'#</td>
<td>#'|| daysrem || '#</td></tr>#');

END LOOP;

CLOSE postComments;

dbms_lob.append(v_Message, q'#</table>
<br><br>
<font size="2">Sent from <font color="red">DanApps</font></font>
</body>
</html>#');

UTL_MAIL.SEND(sender=>'c@xyz.com', recipients=>'a.b@xyz.com', subject=>'Trade license expiry', message => v_Message, priority => 1, mime_type => 'text/html; charset=us-ascii'); --send out emails in HTML format.

END;

输出

正如你所说,如果我输入 q' 则格式将更改如下(抱歉,我无法提供数据。)

请帮我解决问题。提前致谢。

问题是您使用 q' 作为引号定界符,并且没有在该行中用结尾 # 完成它。因此变量最终被解释为字符串。

q'#<tr><td>'|| liscname || '</td>   -- Wrong

q'#<tr><td>#'|| liscname || '</td>  -- Right

并且您在这一行中终止了 #,这也是不正确的

 <td>'|| daysrem || '</td></tr>#');

在您的情况下,由于标签内没有单引号,因此不需要 q' 符号。