Re: Exporting to a .csv file
Date: Tue, 10 Apr 2001 14:01:47 GMT
Message-ID: <fnEA6.1456$%L5.24508_at_insync>
[Quoted] : Hello everyone,
: Can anyone tell me how to Export my database to a comma separated value : file. I have done some reading on the net about this but everywhere I go : they say you need to spool from within SQL*Plus with a custom script, but : there are no examples of this custom script. Can anyone help me?
: Thanks,
: Jeff
Here is a PL/SQL function found on the net and modified to be a little more sophisticated. It uses the UTL_FILE package, so you must look at that to see what directories you can write into. We use this function quite a lot where I work. Enjoy - Stan Milam.
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 || l_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;
/
-- Reply To: milam "at" metronet "dot" com ============================================================= Charter Member of The Society for Mediocre Guitar Playing on Expensive Instruments, Ltd. =============================================================Received on Tue Apr 10 2001 - 16:01:47 CEST
