Re: CSV File Headings....
From: Stan Milam <stmilam_at_swbell.net>
Date: Wed, 21 Jun 2006 03:22:42 GMT
Message-ID: <6Y2mg.26336$VE1.5728_at_newssvr14.news.prodigy.com>
>>Chaz n Dave,
>>
>>Am using reports to generate a CSV file. This is working fine but the
>>users want column headings too.
>>
>>Am trying to output headings but they just get prefixed to the
>>beginning of each row output.
>>
>>Any ideas on how i can achieve this.
>>
>>TIA
>>
Forget reports, use plain ole PL/SQL!
begin
Date: Wed, 21 Jun 2006 03:22:42 GMT
Message-ID: <6Y2mg.26336$VE1.5728_at_newssvr14.news.prodigy.com>
PAUL MADDSION wrote:
> Try using a place holder, and in the before report trigger create the > heading something like this > :rep_header := 'column A, column B, column C'; > Then in the report layout create a field that references the place holder > > It's a while since I did this but I hope it points you in the right > direction. > "Miggins" <mtproc_at_yahoo.co.uk> wrote in message > news:1144664458.487042.31580_at_i39g2000cwa.googlegroups.com... >
>>Chaz n Dave,
>>
>>Am using reports to generate a CSV file. This is working fine but the
>>users want column headings too.
>>
>>Am trying to output headings but they just get prefixed to the
>>beginning of each row output.
>>
>>Any ideas on how i can achieve this.
>>
>>TIA
>>
> > >
Forget reports, use plain ole PL/SQL!
create or replace function
write_sql_to_csv( p_query in varchar2, p_dir in varchar2, p_filename in varchar2, p_separator in varchar2 default ',', p_col_flag in boolean default true ) /**FILE****************************************************************/ /* File Id: writecsv.sql. */ /* Author: Stan Milam. */ /* Date Written: 31-Jan-2001. */ /* Description: */ /* Function to write the columns of a query to a comma seperated */ /* file. */ /* */ /****************************************************************FILE**/ /**********************************************************************/ /* Name: */ /* write_sql_to_csv(). */ /* */ /* Description: */ /* Function which uses dynamic SQL and the UTL_FILE package to */ /* dump the contents of a query to a comma seperated file. */ /* */ /* Arguments: */ /* p_query varchar2 - A string containing the query to be */ /* executed. */ /* p_dir varchar2 - The directory where the file will be */ /* created. */ /* p_filename varchar2 - The filename used to store the file. */ /* p_seperator varchar2 - The character to seperate the fields. */ /* a comma ',' is used by default. */ /* p_col_flag boolean - Default is true in which case column */ /* headers will be created in the file. */ /* */ /* Return Value: */ /* The number of rows written to the CSV file. */ /* */ /**********************************************************************/
return number
is
l_status integer; l_col_count number default 0; l_row_count number default 0; l_output utl_file.file_type; l_separator varchar2(10) default ''; l_wrkbuf varchar2(4000) default ''; l_cursor integer default dbms_sql.open_cursor; /******************************************************************/ /* Special types in the DBMS_SQL package for column information. */ /******************************************************************/ l_columns dbms_sql.desc_tab; l_column_rec dbms_sql.desc_rec;
begin
/******************************************************************/ /* Open the output file and parse the sql statement. */ /******************************************************************/ l_output := utl_file.fopen( p_dir, p_filename, 'w' ); dbms_sql.parse( l_cursor, p_query, dbms_sql.native ); /******************************************************************/ /* Call DBMS_SQL.DESCRIBE_COLUMNS to get the column count of the */ /* query, and the column names if we need them later on. */ /******************************************************************/ dbms_sql.describe_columns( l_cursor, l_col_count, l_columns ); /******************************************************************/ /* Get the column names to use for headers. */ /******************************************************************/ if p_col_flag = true then /**************************************************************/ /* For each column we must process the following. */ /**************************************************************/ for i_sub in 1 .. l_col_count loop /**********************************************************/ /* Get the column record and add column name to the */ /* string */ /**********************************************************/ l_column_rec := l_columns( i_sub ); l_wrkbuf := l_wrkbuf || l_separator || _column_rec.col_name; l_separator := p_separator; end loop; /**************************************************************/ /* Write out the column headers and adjust the row count. */ /**************************************************************/ l_row_count := 1; utl_file.put_line( l_output, l_wrkbuf ); /**************************************************************/ /* Reset these variables. */ /**************************************************************/ l_wrkbuf := ''; l_separator := ''; end if; /******************************************************************/ /* Define all the columns as varchar with a buffer size of 4000 */ /******************************************************************/ for x_sub in 1 .. l_col_count loop begin dbms_sql.define_column( l_cursor, x_sub, l_wrkbuf, 4000 ); exception when others then if ( sqlcode = -1007 ) then exit; else raise; end if; end; end loop; /******************************************************************/ /* Execute the cursor. */ /******************************************************************/ l_status := dbms_sql.execute( l_cursor ); /******************************************************************/ /* Loop through the rows and exit when there are no more. */ /******************************************************************/ while dbms_sql.fetch_rows( l_cursor ) > 0 loop /**************************************************************/ /* For each column in the row, get its value and write it */ /* to the file. */ /**************************************************************/ for i_sub in 1 .. l_col_count loop dbms_sql.column_value( l_cursor, i_sub, l_wrkbuf ); /**********************************************************/ /* If the column value includes the separator value we */ /* need to put quote marks around the value. */ /**********************************************************/ if instr( l_wrkbuf, p_separator ) > 0 then l_wrkbuf := '"' || l_wrkbuf || '"'; end if; utl_file.put( l_output, l_separator || l_wrkbuf ); l_separator := p_separator; end loop; /**************************************************************/ /* Output a new line in preparation of a new row. Also */ /* increment the count of rows we have processed. */ /**************************************************************/ l_separator := ''; utl_file.new_line( l_output ); l_row_count := l_row_count + 1; end loop; /******************************************************************/ /* Close the file and cursor and return the count of rows. */ /******************************************************************/ utl_file.fclose( l_output ); dbms_sql.close_cursor(l_cursor); return l_row_count; exception when others then dbms_output.put_line( 'WRITECSV SQLERRM: ' || sqlerrm ); dbms_output.put_line( 'WRITECSV SQL: ' || p_query ); dbms_output.put_line( 'WRITECSV Dir: ' || p_dir ); dbms_output.put_line( 'WRITECSV File: ' || p_filename ); /**************************************************************/ /* Make sure the file is closed. */ /**************************************************************/ if utl_file.is_open( l_output ) then utl_file.fclose( l_output ); end if; /**************************************************************/ /* Make sure the cursor is closed. */ /**************************************************************/ if dbms_sql.is_open( l_cursor ) then dbms_sql.close_cursor( l_cursor ); end if; /**************************************************************/ /* Return -1 to indicate an error. */ /**************************************************************/ return -1; -- Return an error code.
end write_sql_to_csv;
/
-- Regards, Stan Milam ============================================================= Charter Member of The Society for Mediocre Guitar Playing on Expensive Instruments, Ltd. =============================================================Received on Wed Jun 21 2006 - 05:22:42 CEST