创建应通过电子邮件发送报告的程序时出现编译错误?

问题描述 投票:0回答:1

我需要每天通过电子邮件发送查询结果,但我有错误。请问你能帮忙吗?

create or replace PROCEDURE PROC_SEND_EMAIL AS 
BEGIN
DECLARE
    l_id NUMBER;
    l_clob CLOB;
CURSOR emp_cursor IS
        SELECT
            COLUMN1,COLUMN2
        FROM
            TABLE;
    TYPE emp_data_array IS TABLE OF emp_cursor%ROWTYPE INDEX BY PLS_INTEGER;
    l_emp_data_array emp_data_array;
BEGIN
    -- Fetch data into the array
    OPEN emp_cursor;
    FETCH emp_cursor BULK COLLECT INTO l_emp_data_array;
    CLOSE emp_cursor;
    -- Loop through the array and concatenate data
    FOR i IN 1..l_emp_data_array.COUNT LOOP
        l_clob := l_clob || l_emp_data_array(i).emp_data || CHR(13) || CHR(10);
    END LOOP;
    -- Send email and attach the CLOB data
    l_id := APEX_MAIL.SEND(
        p_to => '[email protected]',
        p_from => '[email protected]',
        p_subj => 'Report daily',
        p_body => 'Please review the attachment.',
        p_body_html => '<b>Please</b> review the attachment'
    );
    APEX_MAIL.ADD_ATTACHMENT(
        p_mail_id => l_id,
        p_attachment => l_clob,
        p_filename => 'mydata.csv',
        p_mime_type => 'text/csv'
    );
    COMMIT;
END;
END;
oracle stored-procedures
1个回答
0
投票

您可以使用隐式游标循环,然后不需要将值收集到关联数组中。

CREATE OR REPLACE PROCEDURE PROC_SEND_EMAIL
AS 
  l_id NUMBER;
  l_clob CLOB;
BEGIN
  FOR r IN (
    SELECT COLUMN1, COLUMN2
    FROM   TABLE
  )
  LOOP
    l_clob := l_clob || r.column1 || ',' || r.column2 || CHR(13) || CHR(10);
  END LOOP;

  -- Send email and attach the CLOB data
  l_id := APEX_MAIL.SEND(
    p_to        => '[email protected]',
    p_from      => '[email protected]',
    p_subj      => 'Report daily',
    p_body      => 'Please review the attachment.',
    p_body_html => '<b>Please</b> review the attachment'
  );
  APEX_MAIL.ADD_ATTACHMENT(
    p_mail_id    => l_id,
    p_attachment => l_clob,
    p_filename   => 'mydata.csv',
    p_mime_type  => 'text/csv'
  );
END;
/

注意:如果

column1
column2
包含逗号,那么您在生成 CSV 时可能需要转义这些值。

© www.soinside.com 2019 - 2024. All rights reserved.