串联问题 - 使用 html 和 SYS_REFCURSOR 的 Oracle 电子邮件
Issue in concatenation - Oracle Email using html and SYS_REFCURSOR
我是 oracle 的新手,正在尝试使用 UTL_MAIL.SEND 发送邮件。我在两者之间使用 HTML
来创建 table 和所有。使用 CLOB
变量存储 HTML
和 SYS_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'
符号。
我是 oracle 的新手,正在尝试使用 UTL_MAIL.SEND 发送邮件。我在两者之间使用 HTML
来创建 table 和所有。使用 CLOB
变量存储 HTML
和 SYS_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'
符号。