Total Pageviews

Friday 27 July 2012

Import data from Table to CSV Oracle 10g

Use to below procedure to import data from table to CSV:

CREATE OR REPLACE PROCEDURE Dump_Table_To_CSV( p_tname IN VARCHAR2,
p_dir IN VARCHAR2,
p_filename IN VARCHAR2 )
IS
l_output UTL_FILE.FILE_TYPE;
l_theCursor INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
l_columnValue VARCHAR2(4000);
l_status INTEGER;
l_query VARCHAR2(1000)
DEFAULT 'select * from ' || p_tname;
l_colCnt NUMBER := 0;
l_separator VARCHAR2(1);
l_descTbl DBMS_SQL.DESC_TAB;
BEGIN
l_output := UTL_FILE.FOPEN( p_dir, p_filename, 'w' );
EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-mon-yyyy hh24:mi:ss''
';

DBMS_SQL.PARSE( l_theCursor, l_query, dbms_sql.native );
DBMS_SQL.DESCRIBE_COLUMNS( l_theCursor, l_colCnt, l_descTbl );

FOR i IN 1 .. l_colCnt LOOP
UTL_FILE.PUT( l_output, l_separator || '"' || l_descTbl(i).col_name || '"'
);
DBMS_SQL.DEFINE_COLUMN( l_theCursor, i, l_columnValue, 4000 );
l_separator := ';';
END LOOP;
UTL_FILE.NEW_LINE( l_output );

l_status := DBMS_SQL.EXECUTE(l_theCursor);

WHILE ( DBMS_SQL.FETCH_ROWS(l_theCursor) > 0 ) LOOP
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 := ';';
END LOOP;
UTL_FILE.NEW_LINE( l_output );
END LOOP;
DBMS_SQL.CLOSE_CURSOR(l_theCursor);
UTL_FILE.FCLOSE( l_output );

EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-yy'' ';
EXCEPTION
WHEN OTHERS THEN
EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-yy'' ';
RAISE;
END;
/

To test the procedure :

exec Dump_Table_To_CSV('EMP_TABLE','DUMP_DIR','EMP_FILE.CSV');

Before executing the procedure make sure the user has read,write permission on the Directory "/home/oracle/DUMP_DIR". (Similar to data pump directory).To check directory information you can use the below queries:

SELECT grantee, table_name directory_name, PRIVILEGE FROM user_tab_privs;
SELECT * FROM all_directories;




No comments:

Post a Comment