Oracle 要通过pl/sql过程将excel作为邮件附件发送吗
当我通过使用clob创建数据的过程发送带有附件的邮件时。 对于小数据,它可以正常工作。但对于大数据来说,它的行为是错误的(对齐方式正在改变)。您能否帮助确定是否需要对代码执行任何操作Oracle 要通过pl/sql过程将excel作为邮件附件发送吗,oracle,stored-procedures,oracle11g,email-attachments,clob,Oracle,Stored Procedures,Oracle11g,Email Attachments,Clob,当我通过使用clob创建数据的过程发送带有附件的邮件时。 对于小数据,它可以正常工作。但对于大数据来说,它的行为是错误的(对齐方式正在改变)。您能否帮助确定是否需要对代码执行任何操作 create or replace PROCEDURE RPT AS l_clob clob; l_bfile bfile; l_fhandle utl_file.file_type; l_buffer VARCHAR2(8192); v_count number; a_count
create or replace PROCEDURE RPT AS
l_clob clob;
l_bfile bfile;
l_fhandle utl_file.file_type;
l_buffer VARCHAR2(8192);
v_count number;
a_count number;
k_count number;
ka_count number;
currentdate DATE;
non_work_days_count number;
BEGIN
--preparing header
dbms_lob.createtemporary (l_clob, TRUE);
l_clob := l_clob
|| 'Column1'|| ','
|| 'Column2' || ','
|| 'Column3' || ','
|| 'Column4' || ','
|| UTL_TCP.crlf;
for crq in (select col1,col2,col3,col4 from table where id=1 ) loop
/* Prepare Details data using Clob */
l_clob := l_clob
|| to_clob(crq.COl1)|| ','
|| to_clob(crq.COL2) || ','
|| to_clob(crq.COL3) || ','
|| to_clob(crq.COL4) || ','
|| UTL_TCP.crlf;
end loop;
for crq in (select col1,col2,col3,col4 from table where id=2 ) loop
/* Prepare Details data using Clob */
l_clob := l_clob
|| to_clob(crq.COl1)|| ','
|| to_clob(crq.COL2) || ','
|| to_clob(crq.COL3) || ','
|| to_clob(crq.COL4) || ','
|| UTL_TCP.crlf;
end loop;
dbms_output.put_line('Sending mail with attachment ');
ATTACHMENT_SEND(p_to=> 'req@Email.com',
p_from=> 'req@Email.com',
p_subject=> ' Report ',
p_text_msg=>'Hi All',
p_attach_name =>'report_'||sysdate||'.csv',
p_attach_mime =>'text/plain',
p_attach_clob =>l_clob,
p_smtp_host=>'host.com');
dbms_lob.freetemporary(l_clob);
END RPT;
我还观察到,当字符长度达到32000时,它正在中断(留下剩余数据)
创建的excel附件中的数据存在对齐问题
|
串联在Oracle SQL中最多可限制4000,而在PL/SQL中最多可限制32000。您可以尝试[DBMS_LOB.APPEND][1]过程来连接长CLOB。因此,您可以尝试将代码转换为-
CREATE OR REPLACE PROCEDURE RPT AS
l_clob clob;
l_bfile bfile;
l_fhandle utl_file.file_type;
l_buffer VARCHAR2(8192);
v_count number;
a_count number;
k_count number;
ka_count number;
currentdate DATE;
non_work_days_count number;
BEGIN
--preparing header
dbms_lob.createtemporary (l_clob, TRUE);
l_clob := l_clob
|| 'Column1'|| ','
|| 'Column2' || ','
|| 'Column3' || ','
|| 'Column4' || ','
|| UTL_TCP.crlf;
for crq in (select col1,col2,col3,col4 from table where id=1 ) loop
/* Prepare Details data using Clob */
l_clob := DBMS_LOB.APPEND(
DBMS_LOB.APPEND(
DBMS_LOB.APPEND(
DBMS_LOB.APPEND(l_clob
,to_clob(crq.COl1) || ',')
,to_clob(crq.COL2) || ',')
,to_clob(crq.COL3) || ',')
,to_clob(crq.COL4) || ',' || UTL_TCP.crlf);
end loop;
for crq in (select col1,col2,col3,col4 from table where id=2 ) loop
/* Prepare Details data using Clob */
l_clob := DBMS_LOB.APPEND(
DBMS_LOB.APPEND(
DBMS_LOB.APPEND(
DBMS_LOB.APPEND(l_clob
,to_clob(crq.COl1) || ',')
,to_clob(crq.COL2) || ',')
,to_clob(crq.COL3) || ',')
,to_clob(crq.COL4) || ',' || UTL_TCP.crlf);
end loop;
dbms_output.put_line('Sending mail with attachment ');
ATTACHMENT_SEND(p_to => 'req@Email.com',
p_from => 'req@Email.com',
p_subject => ' Report ',
p_text_msg =>'Hi All',
p_attach_name =>'report_'||sysdate||'.csv',
p_attach_mime =>'text/plain',
p_attach_clob =>l_clob,
p_smtp_host =>'host.com');
dbms_lob.freetemporary(l_clob);
END RPT;
[1]: https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i997432
在搜索了很多之后,我发现了一种不同的方法,它对我来说就像一块宝石(可以处理成千上万的记录)。我以为有一天它会帮助别人 步骤: 1) 创建了一个目录(其中存储了预期的excel)。 2) 将select语句的输出写入上述文件。 3) 在上面的位置选择文件并将其发送到邮件附件中
注意:如果任何人需要SMTP代码部分或任何帮助,请告诉我Hi@Ankit,谢谢回答。错误(85,23):PLS-00222:如果我使用作为DBMS_LOB.APPEND(l_clob,to_clob(crq.COl1)| | | |,'),则此范围中不存在名为“APPEND”的函数;DBMS_LOB.APPEND(l_clob,to_clob(crq.COl2)| |',');DBMS_LOB.APPEND(l_clob,to_clob(crq.COl3)| |',');DBMS|u LOB.APPEND(l_clob,to_clob(crq.COl4)| |','| | UTL_TCP.crlf);那么没有错误,但在excel中它应该显示280条记录,但只有230条记录符合230条违反32000限制的记录?是@ankit。在有人问你之前,他们违反了,最好在这里发布代码。