Oracle 将SQL查询输出作为CSV附件发送(pl/SQL)
我有一个pl/sql查询,我希望它的输出以CSV格式直接发送到电子邮件中。我没有目录可以先创建并保存CSV文件,然后将其作为附件发送 由于我无法脱身,请您提供帮助 问候,,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
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而不必存储文件。成功了!干杯