New Oracle@Oracle paper shows how GoldenGate allowed for real-time operational reporting for Oracle E-Business Suite: http://t.co/SQVfHcD7
Email attached CSV file of query from APEX
Firstly, you will need a function that takes a SQL query and outputs the text results of this query into a BLOB.
GET_REPORT Function - Turns a query into a BLOB of CSV format
The following function was written by Marc Sewtz (more information can be found: http://marcsewtz.blogspot.com/2008/04/generating-csv-files-and-storing-them.html )
create or replace function get_report (
p_query varchar2
) return blob is
l_cursor integer;
l_cursor_status integer;
l_col_count number;
l_desc_tbl sys.dbms_sql.desc_tab2;
l_col_val varchar2(32767);
l_report blob;
l_raw raw(32767);
begin
-- open BLOB to store CSV file
dbms_lob.createtemporary( l_report, FALSE );
dbms_lob.open( l_report, dbms_lob.lob_readwrite );
-- parse query
l_cursor := dbms_sql.open_cursor;
dbms_sql.parse(l_cursor, p_query, dbms_sql.native);
dbms_sql.describe_columns2(l_cursor, l_col_count, l_desc_tbl );
-- define report columns
for i in 1 .. l_col_count loop
dbms_sql.define_column(l_cursor, i, l_col_val, 32767 );
end loop;
-- write column headings to CSV file
for i in 1 .. l_col_count loop
l_col_val := l_desc_tbl(i).col_name;
if i = l_col_count then
l_col_val := '"'||l_col_val||'"'||chr(10); </span><br /><span class="Moobi_Code"> else</span><br /><span class="Moobi_Code"> l_col_val := '"'||l_col_val||'",';</span><br /><span class="Moobi_Code"> end if;</span><br /><span class="Moobi_Code"> l_raw := utl_raw.cast_to_raw( l_col_val );</span><br /><span class="Moobi_Code"> dbms_lob.writeappend( l_report, utl_raw.length( l_raw ), l_raw );</span><br /><span class="Moobi_Code"> end loop; </span><br /><br /><span class="Moobi_Code"> l_cursor_status := sys.dbms_sql.execute(l_cursor);</span><br /><br /><span class="Moobi_Code"> -- write result set to CSV file</span><br /><span class="Moobi_Code"> loop</span><br /><span class="Moobi_Code"> exit when dbms_sql.fetch_rows(l_cursor) <= 0; </span><br /><span class="Moobi_Code"> for i in 1 .. l_col_count loop</span><br /><span class="Moobi_Code"> dbms_sql.column_value(l_cursor, i, l_col_val);</span><br /><span class="Moobi_Code"> if i = l_col_count then</span><br /><span class="Moobi_Code"> l_col_val := '"'||l_col_val||'"'||chr(10); </span><br /><span class="Moobi_Code"> else</span><br /><span class="Moobi_Code"> l_col_val := '"'||l_col_val||'",';</span><br /><span class="Moobi_Code"> end if;</span><br /><span class="Moobi_Code"> l_raw := utl_raw.cast_to_raw( l_col_val );</span><br /><span class="Moobi_Code"> dbms_lob.writeappend( l_report, utl_raw.length( l_raw ), l_raw );</span><br /><span class="Moobi_Code"> end loop; </span><br /><span class="Moobi_Code"> end loop;</span><br /> <br /><span class="Moobi_Code"> dbms_sql.close_cursor(l_cursor);</span><br /><span class="Moobi_Code"> dbms_lob.close( l_report );</span><br /> <br /><span class="Moobi_Code"> -- return CSV file</span><br /><span class="Moobi_Code"> return l_report;</span><br /> <br /><span class="Moobi_Code">end get_report;</span><br /><br /><br /><br /><br /><span class="Moobi_Body_Bold">Procedure to take the BLOB and email it as a CSV attachment</span><br /><br /><span class="Moobi_Body">I have then written a procedure to take this BLOB and send it via email as an attachment:</span><br /><br /><span class="Moobi_Code">create or replace procedure email_my_query (</span><br /><span class="Moobi_Code"> p_query varchar2</span>,<br /><span class="Moobi_Code">p_email_to varchar2,</span><br /><span class="Moobi_Code">p_subject varchar2</span><br /><span class="Moobi_Code"> ) AS</span><br /> <span class="Moobi_Code"></span><br /><span class="Moobi_Code"> v_file blob;</span><br /><span class="Moobi_Code"> v_body varchar2(1000);</span><br /><span class="Moobi_Code"> v_id number;</span><br /> <br /><span class="Moobi_Code"> BEGIN</span><br /><span class="Moobi_Code"></span><br /> <br /><span class="Moobi_Code"> v_file := get_report(p_query);</span><br /> <br /><span class="Moobi_Code"> v_body := 'Here is your CSV File';</span><br /><span class="Moobi_Code"></span><br /><span class="Moobi_Code"> begin</span><br /><span class="Moobi_Code"> wwv_flow_api.set_security_group_id;</span><br /><span class="Moobi_Code"> end; </span><br /><br /><span class="Moobi_Code">v_id := apex_mail.send(</span><br /> <span class="Moobi_Code">p_to => p_email_to,</span><br /><span class="Moobi_Code"> p_from => ' This e-mail address is being protected from spambots. You need JavaScript enabled to view it. ',</span><br /><span class="Moobi_Code"> p_body => v_body,</span><br /><span class="Moobi_Code"> p_subj => p_subject);</span><br /> <br /><span class="Moobi_Code">apex_mail.add_attachment(</span><br /><span class="Moobi_Code"> p_mail_id => v_id,</span><br /><span class="Moobi_Code"> p_attachment => v_file,</span><br /><span class="Moobi_Code"> p_filename => 'test.csv',</span><br /><span class="Moobi_Code"> p_mime_type => 'text/plain');</span><br /> <br /><span class="Moobi_Code">apex_mail.push_queue();</span><br /><br /><br /><br /><span class="Moobi_Code"> END email_my_query;</span><br /><br /><br /><br /><br /><span class="Moobi_Body_Bold">Test the Procedure</span><br /><br /><span class="Moobi_Body">Now all you have to do is run the following to test it out!</span><br /><br /><span class="Moobi_Code">BEGIN</span><br /><span class="Moobi_Code">email_my_query('select * from mytable', ' This e-mail address is being protected from spambots. You need JavaScript enabled to view it. ', 'This is a CSV Email');</span><br /><span class="Moobi_Code">END;</span><br /><br /><br /><span class="Moobi_Body">This could then be further extended by creating a scheduled job to routinely email you results from a table.</span><br /><br /><br /><span class="Moobi_Body_Bold">Download an example in a package:</span><br /><a target="_blank" class="jce_file" title="EMAIL_CSV_DATA_PKG.txt" href="images/stories/APEX/SampleCode/EMAIL_CSV_DATA_PKG.txt"><br />EMAIL_DATA_CSV_PKG.sql</a><br /><br /><br /><br /><br />'


