Stored procedures 通过pl/sql将csv文件作为附件发送时,过程数据将被截断,并且附件中缺少对齐

Stored procedures 通过pl/sql将csv文件作为附件发送时,过程数据将被截断,并且附件中缺少对齐,stored-procedures,plsql,oracle11g,clob,Stored Procedures,Plsql,Oracle11g,Clob,我想每天以excel附件的形式发送查询输出。如果数据较少(大约40行10列),工作正常。但对于300行数据(>32k个字符),它不起作用(在几行之后截断数据,并且也存在对齐问题) 我尝试使用DBMS\u LOB\u append而不是字符串连接 附件(发送) create or replace PROCEDURE ATTACHMENT_SEND (p_to IN VARCHAR2, p_from

我想每天以excel附件的形式发送查询输出。如果数据较少(大约40行10列),工作正常。但对于300行数据(>32k个字符),它不起作用(在几行之后截断数据,并且也存在对齐问题)

我尝试使用DBMS\u LOB\u append而不是字符串连接

附件(发送)

    create or replace PROCEDURE ATTACHMENT_SEND (p_to          IN VARCHAR2,
                                   p_from        IN VARCHAR2,
                                   p_subject     IN VARCHAR2,
                                   p_text_msg    IN VARCHAR2 DEFAULT NULL,
                                   p_attach_name IN VARCHAR2 DEFAULT NULL,
                                   p_attach_mime IN VARCHAR2 DEFAULT NULL,
                                   p_attach_clob IN CLOB DEFAULT NULL,
                                   p_smtp_host   IN VARCHAR2,
                                   p_smtp_port   IN NUMBER DEFAULT 25)
 AS
 l_mail_conn   UTL_SMTP.connection;
  l_boundary    VARCHAR2(50) := '----=*#abc1234321cba#*=';
   l_step        PLS_INTEGER  := 24570; -- make sure you set a multiple of 3 
not higher than 24573
 vLine VARCHAR2(100);
  TO_parties varchar2(2000);

  BEGIN
 l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
 UTL_SMTP.helo(l_mail_conn, p_smtp_host);
 UTL_SMTP.mail(l_mail_conn, p_from);


 --Sending to multile ID
 for i in (SELECT LEVEL AS id, REGEXP_SUBSTR(p_to, '[^;]+', 1, LEVEL) AS 
 to_email_name
       FROM dual
       CONNECT BY REGEXP_SUBSTR(p_to, '[^;]+', 1, LEVEL) IS NOT NULL) loop
TO_parties := TO_parties||';'|| i.to_email_name;
 utl_smtp.Rcpt(l_mail_conn,i.to_email_name);

  end loop;

  UTL_SMTP.open_data(l_mail_conn);



  UTL_SMTP.write_data(l_mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY 
  HH24:MI:SS') || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
 UTL_SMTP.write_data(l_mail_conn, 'Subject: ' || p_subject || UTL_TCP.crlf);
 UTL_SMTP.write_data(l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'MIME-Version: 1.0' || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'Content-Type: multipart/mixed; 
  boundary="' || l_boundary || '"' || UTL_TCP.crlf || UTL_TCP.crlf);

  IF p_text_msg IS NOT NULL THEN
   UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
   UTL_SMTP.write_data(l_mail_conn, 'Content-Type: text/plain; charset="iso- 
   8859-1"' || UTL_TCP.crlf || UTL_TCP.crlf);

    UTL_SMTP.write_data(l_mail_conn, p_text_msg);
    UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
   END IF;

   IF p_attach_name IS NOT NULL THEN
    UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
    UTL_SMTP.write_data(l_mail_conn, 'Content-Type: ' || p_attach_mime || '; 
    name="' || p_attach_name || '"' || UTL_TCP.crlf);
    UTL_SMTP.write_data(l_mail_conn, 'Content-Disposition: attachment; 
     filename="' || p_attach_name || '"' || UTL_TCP.crlf || UTL_TCP.crlf);

    FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_attach_clob) - 1 )/l_step) 
   LOOP
    UTL_SMTP.write_data(l_mail_conn, DBMS_LOB.substr(p_attach_clob, l_step, 
  i * l_step + 1));
   END LOOP;

   UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
   END IF;

   UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || '--' || 
   UTL_TCP.crlf);
   UTL_SMTP.close_data(l_mail_conn);

  UTL_SMTP.quit(l_mail_conn);
    END;

请检查它被截断的原因,或者建议任何其他可能的方式发送带有附件的邮件。

您可能需要显示
附件发送
正在做什么。(您声明的一些变量没有被使用,我想是因为这些都是一个步骤,在添加单独的过程时它们没有被清理?)嗨@AlexPoole,我已经包括了附件。请check@AlexPoole,我尝试删除未使用的变量,但问题仍然是您使用的是11g。为什么您要使用手工编写的低级SMTP命令例程,而不是?另外,您是否尝试使用记录CLOB的大小来确定截断发生的位置?@APC,当使用dbms_lob.getlength()时,我得到的字符数为24356。但在Excel中,我只得到大约15000个字符。对不起,我不应该使用UTL_邮件。
    create or replace PROCEDURE ATTACHMENT_SEND (p_to          IN VARCHAR2,
                                   p_from        IN VARCHAR2,
                                   p_subject     IN VARCHAR2,
                                   p_text_msg    IN VARCHAR2 DEFAULT NULL,
                                   p_attach_name IN VARCHAR2 DEFAULT NULL,
                                   p_attach_mime IN VARCHAR2 DEFAULT NULL,
                                   p_attach_clob IN CLOB DEFAULT NULL,
                                   p_smtp_host   IN VARCHAR2,
                                   p_smtp_port   IN NUMBER DEFAULT 25)
 AS
 l_mail_conn   UTL_SMTP.connection;
  l_boundary    VARCHAR2(50) := '----=*#abc1234321cba#*=';
   l_step        PLS_INTEGER  := 24570; -- make sure you set a multiple of 3 
not higher than 24573
 vLine VARCHAR2(100);
  TO_parties varchar2(2000);

  BEGIN
 l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
 UTL_SMTP.helo(l_mail_conn, p_smtp_host);
 UTL_SMTP.mail(l_mail_conn, p_from);


 --Sending to multile ID
 for i in (SELECT LEVEL AS id, REGEXP_SUBSTR(p_to, '[^;]+', 1, LEVEL) AS 
 to_email_name
       FROM dual
       CONNECT BY REGEXP_SUBSTR(p_to, '[^;]+', 1, LEVEL) IS NOT NULL) loop
TO_parties := TO_parties||';'|| i.to_email_name;
 utl_smtp.Rcpt(l_mail_conn,i.to_email_name);

  end loop;

  UTL_SMTP.open_data(l_mail_conn);



  UTL_SMTP.write_data(l_mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY 
  HH24:MI:SS') || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
 UTL_SMTP.write_data(l_mail_conn, 'Subject: ' || p_subject || UTL_TCP.crlf);
 UTL_SMTP.write_data(l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'MIME-Version: 1.0' || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'Content-Type: multipart/mixed; 
  boundary="' || l_boundary || '"' || UTL_TCP.crlf || UTL_TCP.crlf);

  IF p_text_msg IS NOT NULL THEN
   UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
   UTL_SMTP.write_data(l_mail_conn, 'Content-Type: text/plain; charset="iso- 
   8859-1"' || UTL_TCP.crlf || UTL_TCP.crlf);

    UTL_SMTP.write_data(l_mail_conn, p_text_msg);
    UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
   END IF;

   IF p_attach_name IS NOT NULL THEN
    UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
    UTL_SMTP.write_data(l_mail_conn, 'Content-Type: ' || p_attach_mime || '; 
    name="' || p_attach_name || '"' || UTL_TCP.crlf);
    UTL_SMTP.write_data(l_mail_conn, 'Content-Disposition: attachment; 
     filename="' || p_attach_name || '"' || UTL_TCP.crlf || UTL_TCP.crlf);

    FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_attach_clob) - 1 )/l_step) 
   LOOP
    UTL_SMTP.write_data(l_mail_conn, DBMS_LOB.substr(p_attach_clob, l_step, 
  i * l_step + 1));
   END LOOP;

   UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
   END IF;

   UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || '--' || 
   UTL_TCP.crlf);
   UTL_SMTP.close_data(l_mail_conn);

  UTL_SMTP.quit(l_mail_conn);
    END;