Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 将SQL查询输出作为CSV附件发送(pl/SQL)_Oracle - Fatal编程技术网

Oracle 将SQL查询输出作为CSV附件发送(pl/SQL)

Oracle 将SQL查询输出作为CSV附件发送(pl/SQL),oracle,Oracle,我有一个pl/sql查询,我希望它的输出以CSV格式直接发送到电子邮件中。我没有目录可以先创建并保存CSV文件,然后将其作为附件发送 由于我无法脱身,请您提供帮助 问候,, Sachin您可以创建这样一个程序: create or replace procedure prFileSend is v_mail_owner varchar2(100):='myname@someComp.com'; v_url varchar2(4000); v_rep var

我有一个pl/sql查询,我希望它的输出以CSV格式直接发送到电子邮件中。我没有目录可以先创建并保存CSV文件,然后将其作为附件发送

由于我无法脱身,请您提供帮助

问候,,
Sachin

您可以创建这样一个程序:

create or replace procedure prFileSend is
  v_mail_owner varchar2(100):='myname@someComp.com';
  v_url        varchar2(4000);
  v_rep        varchar2(4000);
  delimiter    varchar2(1) := chr(38);
begin
   for c in ( select * from myTable ) 
   loop
   begin
         v_url := 'http://www.mycompany.com/einfo/default.aspx?email='||c.email || delimiter || 'p1=' || c.col1 || delimiter ||'p2='||c.col2;
         v_rep := utl_http.request(utl_url.escape(v_url, false,'ISO-8859-9'));
    end;
    end loop;
exception
  when others then
    prErrorMsgSend(v_mail_owner,'Error : ' || sqlerrm); -- a function like this one which sends an error message back to you.   
end;
并创建一个调度程序作业

begin
dbms_scheduler.create_job (
   job_name           =>  'jbFileSend ',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'prFileSend',
   start_date         =>  '22-jan-2018 09:00:00 am',
   repeat_interval    =>  'FREQ=DAILY; INTERVAL=1',
   comments           =>  'Sending Every day'
   enabled            =>   true);
end;

以每天工作为例。

最终在收到的指针的帮助下找到了解决方案,并提供相同的指针以进一步帮助其他人,以备将来需要

我的问题是,我主要看到的例子是,我可以将文件保存在一个目录中,或者从一个目录中选择文件作为附件发送,但我没有提供目录,我希望查询结果放在CSV中,并在电子邮件中动态发送。这就是完整的解决方案

CREATE OR REPLACE PROCEDURE  SEND_CSV_ATTACHMENT AS
    v_sender                        VARCHAR2(130);
    v_recipients                    VARCHAR2(4000);
    v_cc                            VARCHAR2(4000);
    v_bcc                           VARCHAR2(2000);
    v_subj                          VARCHAR2(200);
    v_msg                           CLOB;
    v_mime                          VARCHAR2(40);
    v_tbl                             VARCHAR2(20000);
    c_cr_lf                       CONSTANT CHAR (2) := (CHR (13) || CHR (10)); -- Carriage Return/Line Feed characters for formatting text emails
    v_loop_count            PLS_INTEGER := 0;
    v_attachment            CLOB;


      v_block_qry VARCHAR2(3000); 
      v_block_row VARCHAR2(6000); 
    TYPE bl_cur IS REF CURSOR;
    v_result bl_cur;
    v_rowcount NUMBER;
    errMsg      VARCHAR2(15000);   
    
  BEGIN
    
      v_sender := 'somesender@xyzcommunications.com';      
      
      SELECT NVL(EMAIL_LIST, 'someone@abcd.com')   
      FROM
      (
        SELECT LISTAGG(EMAIL_ID, ',') WITHIN GROUP (ORDER BY EMAIL_ID) AS EMAIL_LIST FROM RECIPEINTS_TABLE WHERE SEND_TO = 1 AND IS_ACTIVE = 1
      );     
      
      SELECT NVL(EMAIL_LIST, 'someone@abcd.com')   
      FROM
      (
        SELECT LISTAGG(EMAIL_ID, ',') WITHIN GROUP (ORDER BY EMAIL_ID) AS EMAIL_LIST FROM RECIPEINTS_TABLE WHERE SEND_CC = 1 AND IS_ACTIVE = 1
      );    
      
          
      v_bcc := 'someone@abcd.com';

      -- Generate attachment - Begin 
      v_attachment := '"COL1", "COL2"' || CHR(13) || CHR(10);
      

      v_block_qry := 'SELECT ''"'' || COL1 || ''", "'' || COL2 ||  ''"'' AS ROWTXT        
                      FROM MY_TABLE';


      OPEN v_result FOR v_block_qry;
        LOOP 
        v_rowcount := v_result%ROWCOUNT;
        FETCH v_result INTO v_block_row;
          EXIT WHEN v_result%NOTFOUND;          
          v_attachment := v_attachment || v_block_row || chr(13) || chr(10);
        END LOOP;
      CLOSE v_result;

      -- Generate attachment - End

     

    v_subj:= 'MAIL_SUBJECT ' || TO_CHAR(TRUNC(SYSDATE-1), 'YYYY-MM-DD');

      UTL_MAIL.send_attach_varchar2(sender => v_sender,
      recipients        => v_recipients,
      cc                => v_cc,
      bcc               => v_bcc,
      subject           => v_subj,
      message           =>  v_msg,
      mime_type         => 'text/html; charset=us-ascii', -- send html e-mail
      attachment        => v_attachment, 
      att_inline        => FALSE,
      att_filename      => 'Change_Report' || TO_CHAR(TRUNC(SYSDATE-1), 'YYYY-MM-DD') || '.csv');
  EXCEPTION    
    WHEN OTHERS THEN
    errMsg := SQLERRM;    
    SEND_MAIL_HTML ('someone@abcd.com', NULL, NULL, errMsg, 'SEND_MAIL ERROR: ' || errMsg);   

END SEND_CSV_ATTACHMENT;

请回答您的问题,并向我们展示存储过程的源代码。请您的问题不要在评论中发布代码或其他信息您说您有PL/SQL代码-所以您需要向我们展示存储的procedure@a_horse_with_no_name我不确定这会有什么不同。该代码返回我需要保存到附件中的数据。它可以是任何类似于从DUAL中选择1,2等的内容。从DUAL中选择1,2不是PL/SQL过程,而是SQL查询。SQL进行查询,PL/SQL是编程语言。没有plsql查询。如果它是一个您想要的指针,请查看后面的。感谢您的响应,但请您澄清为什么循环中存在此url?@SachinVaidya能够发送给表中记录的每个邮件所有者。不客气。我正在使用表存储收件人,并根据需要将他们设置为、收件人、抄送或密件抄送。感谢您发布解决方案。我需要做完全相同的事情:通过邮件发送csv而不必存储文件。成功了!干杯