| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> script to create comma delimited files
I'm sure everybody has a version of this, but here's one I wrote
which works pretty well, and is very simple to use - compared to
other scripts I've tried in the past. Let me know what you think.
I'm sharing this because I've been very frustrated in the past
trying to create just a simple comma-delimited file from Oracle.
There really is no "simple" way, I've discovered, and I got tired
of using Access...
/*
CREATE OR REPLACE PROCEDURE create_comma_file (tab_name_in IN VARCHAR2) AS
file1 UTL_FILE.FILE_TYPE; column_string VARCHAR2(4000); last_column_data_type VARCHAR2(40); s1 VARCHAR2(4000); cursor1 INTEGER; ret_val INTEGER; tab_name_in_converted VARCHAR2(255);
CURSOR c1a IS
SELECT table_name FROM user_tables
WHERE TABLE_NAME = UPPER(tab_name_in);
CURSOR c1 IS
SELECT table_name FROM user_tables
WHERE num_rows > 0
AND table_name NOT IN
(SELECT table_name FROM user_tab_columns WHERE data_type = 'LONG
RAW');
CURSOR c2 (table_name_in VARCHAR2) IS
SELECT column_name, data_type
FROM user_tab_columns
WHERE table_name = table_name_in
ORDER BY column_id; /* this is very important to maintain order in
the text files!!! */
CURSOR c3 IS
SELECT table_name FROM user_tab_columns WHERE data_type = 'LONG RAW';
long_raw_exception EXCEPTION;
PRAGMA EXCEPTION_INIT (long_raw_exception, -932);
empty_table_exception EXCEPTION;
PRAGMA EXCEPTION_INIT (empty_table_exception, -1002);
BEGIN cursor1 := DBMS_SQL.OPEN_CURSOR;
/* CREATE FILE FOR ONE TABLE ONLY */
IF UPPER(tab_name_in) != 'ALL' THEN
/* don't really need a loop here, but nested cursor c2 doesn't work otherwise */
FOR c1a_rec IN c1a LOOP
/* The file specified here should be the same as utl_file_dir */
file1 := UTL_FILE.FOPEN('d:\klfolder\test', c1a_rec.table_name||'.txt', 'W');
/* build up a concatenated string of columns, unique for each table */
FOR c2_rec IN c2 (c1a_rec.table_name) LOOP
IF c2_rec.data_type = 'VARCHAR2' THEN column_string := column_string||'''"'''||'||'||c2_rec.column_name||'||''",''||'; ELSE column_string := column_string||c2_rec.column_name||'||'',''||'; END IF; last_column_data_type := c2_rec.data_type; END LOOP; IF last_column_data_type = 'VARCHAR2' THEN /* remove extraneous characters from end of string */ column_string := SUBSTR(column_string, 1, LENGTH(column_string)-8); column_string := column_string||'||'||'''"'''; ELSE column_string := SUBSTR(column_string, 1,LENGTH(column_string)-7);
END IF;
DBMS_SQL.PARSE( cursor1, 'SELECT '||column_string||' FROM '||c1a_rec.table_name, DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(cursor1, 1, s1, 4000); ret_val := DBMS_SQL.EXECUTE_AND_FETCH (cursor1); LOOP DBMS_SQL.COLUMN_VALUE (cursor1, 1, s1); UTL_FILE.PUT_LINE(file1, s1); EXIT WHEN DBMS_SQL.FETCH_ROWS (cursor1) = 0; END LOOP; UTL_FILE.FCLOSE(file1); END LOOP;
/* CREATE FILES FOR *ALL* USER TABLES */ ELSE
/* for each table in user_tables, loop to get the table_name */
FOR c1_rec IN c1 LOOP
/* The file specified here should be the same as
utl_file_dir */
file1 := UTL_FILE.FOPEN('d:\klfolder\test',
c1_rec.table_name||'.txt', 'W');
/* build up a concatenated string of columns, unique for each table */
FOR c2_rec IN c2 (c1_rec.table_name) LOOP
IF c2_rec.data_type = 'VARCHAR2' THEN column_string := column_string||'''"'''||'||'||c2_rec.column_name||'||''",''||'; ELSE column_string := column_string||c2_rec.column_name||'||'',''||'; END IF; last_column_data_type := c2_rec.data_type; END LOOP; IF last_column_data_type = 'VARCHAR2' THEN /* remove extraneous characters from end of string */ column_string := SUBSTR(column_string, 1, LENGTH(column_string)-8); column_string := column_string||'||'||'''"'''; ELSE column_string := SUBSTR(column_string, 1,LENGTH(column_string)-7);
END IF;
DBMS_SQL.PARSE( cursor1, 'SELECT '||column_string||' FROM '||c1_rec.table_name, DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(cursor1, 1, s1, 4000); ret_val := DBMS_SQL.EXECUTE_AND_FETCH (cursor1); LOOP DBMS_SQL.COLUMN_VALUE (cursor1, 1, s1); UTL_FILE.PUT_LINE(file1, s1); EXIT WHEN DBMS_SQL.FETCH_ROWS (cursor1) = 0; END LOOP; UTL_FILE.FCLOSE(file1); column_string := ''; /* reset column_string variable*/
END LOOP; DBMS_OUTPUT.PUT_LINE ('Tables which did not have files created for them because they contain long raw columns:');
FOR c3_rec IN c3 LOOP DBMS_OUTPUT.PUT_LINE (c3_rec.table_name); END LOOP;
END IF;
EXCEPTION
WHEN long_raw_exception THEN
DBMS_OUTPUT.PUT_LINE (CHR(9));
DBMS_OUTPUT.PUT_LINE ('ERROR: Cannot run this procedure
against a table with a long raw column');
WHEN empty_table_exception THEN
DBMS_OUTPUT.PUT_LINE (CHR(9));
DBMS_OUTPUT.PUT_LINE ('ERROR: Cannot run this procedure
against an empty table');
END;
/
Sent via Deja.com http://www.deja.com/
Share what you know. Learn what you don't.
Received on Fri Aug 06 1999 - 16:13:47 CDT
![]() |
![]() |