Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.server -> Re: Advice on Dumping a Cursor to a Text file..

Re: Advice on Dumping a Cursor to a Text file..

From: Thomas J. Kyte <tkyte_at_us.oracle.com>
Date: 2000/04/01
Message-ID: <8c4vm5$grb$1@nnrp1.deja.com>#1/1

In article <8c2c3p$nkc$1_at_nnrp1.deja.com>, tim.mcconechy_at_runtime.dk wrote:
> HI!
>
> I want to make a generic Procedure in PL\SQL using UTL_FILE
>
> That will accept a cursor and
> Create a ; delimited text file based on it's contents.
>
> Has anyone out there had experience with this.
>
> The trick is to convert all file types to char and
> the fact that I don't know how many columns or what the column types
> would be..
>
> Can anyone give me any advice on how to approch this ...
>
> Thanks!
>
> Sent via Deja.com http://www.deja.com/
> Before you buy.
>

something like this:
create or replace function dump_csv( p_query in varchar2, p_separator in varchar2
default ',',
p_dir in varchar2 ,
p_filename in varchar2 )
return number
is

l_output utl_file.file_type;
l_theCursor integer default dbms_sql.open_cursor;
l_columnValue varchar2(2000);
l_status integer;
l_colCnt number default 0;
l_separator varchar2(10) default '';
l_cnt number default 0;

begin
l_output := utl_file.fopen( p_dir, p_filename, 'w' ); dbms_sql.parse( l_theCursor, p_query, dbms_sql.native ); for i in 1 .. 255 loop
begin
dbms_sql.define_column( l_theCursor, i, l_columnValue, 2000 );
l_colCnt := i;
exception
when others then
if ( sqlcode = -1007 ) then exit;
else
raise;
end if;
end;
end loop;
dbms_sql.define_column( l_theCursor, 1, l_columnValue, 2000 ); l_status := dbms_sql.execute(l_theCursor); loop
exit when ( dbms_sql.fetch_rows(l_theCursor) <= 0 ); l_separator := '';
for i in 1 .. l_colCnt loop
dbms_sql.column_value( l_theCursor, i, l_columnValue );
utl_file.put( l_output, l_separator || l_columnValue );
l_separator := p_separator;
end loop;
utl_file.new_line( l_output );
l_cnt := l_cnt+1;
end loop;
dbms_sql.close_cursor(l_theCursor);
utl_file.fclose( l_output );
return l_cnt;
end dump_csv;
/
create or replace procedure test_dump_csv as
l_rows number;
begin
l_rows := dump_csv( 'select * from all_users where rownum < 25', ',', '/tmp', 'test.dat' );
end;
/
--
Thomas Kyte tkyte_at_us.oracle.com
Oracle Service Industries http://osi.oracle.com/~tkyte/index.html
--
Opinions are mine and do not necessarily reflect those of Oracle Corp


Sent via Deja.com http://www.deja.com/
Before you buy.
Received on Sat Apr 01 2000 - 00:00:00 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US