Oracle 要通过pl/sql过程将excel作为邮件附件发送吗

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

当我通过使用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 := 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。在有人问你之前,他们违反了,最好在这里发布代码。