Export TABLE Records into Flat File with INSERTs

The GENERATE_STMT procedure of this UTILITY package needs four parameters i.e. TABLE NAME, WHERE CLAUSE, PATH WHERE Developer WANT FILE TO BE GENERATED and FILE NAME. WHERE CLAUSE value must be passed in the form of quotes. For e.g. ‘WHERE ename = ‘ || ”” || ‘SCOTT’ || ””

This procedure writes an ASCII file to specified folder. UTL_FILE_DIR parameter must be set in the init.ora file prior to installing and running the procedure.

This package looks for TABLE COLUMNS in USER_TAB_COLUMNS data dictionary. So user will be able to fetch the data only from the table(s) which resides in the CURRENT SCHEMA.

First create the UTILITY package.


/***************************************************************************
 CREATED BY:    Nikhil Dave     nikhil@mailindia.stgil.com

 COMPANY:       Keysone Solutions Pvt. Ltd.
 DATE:          20.02.2003
 OBJECTIVE:     Export data into Flat file in the form of INSERT statment(s).

 VERSION TESTING:   This script was tested on Oracle 8.1.6 AND
                    8.1.7. It can be used on SQL*Plus as well
                    as from any PL/SQL Object.

***************************************************************************/

CREATE OR REPLACE PACKAGE utility
IS
        FUNCTION change_datatype (
                prm_value                       IN VARCHAR2,
                prm_data_type                   IN VARCHAR2)
        RETURN VARCHAR2;

        PROCEDURE generate_stmt (
                prm_table_name                  IN VARCHAR2,
                prm_where_clause                IN VARCHAR2,
                prm_output_folder               IN VARCHAR2,
                prm_output_file                 IN VARCHAR2);
END utility;
/

CREATE OR REPLACE PACKAGE BODY utility
IS

        -- VARIABLES USED by PROCEDURE generate_stmt
                --      File Related PACKAGE Variable
                cmn_file_handle         UTL_FILE.file_type;
                --
        --

        PROCEDURE close_file
        IS
        BEGIN
                UTL_FILE.FCLOSE (cmn_file_handle);
        EXCEPTION

                WHEN UTL_FILE.INVALID_FILEHANDLE THEN
                        RAISE_APPLICATION_ERROR(-20003, 'File handle was invalid');
                WHEN UTL_FILE.INVALID_PATH THEN
                        RAISE_APPLICATION_ERROR(-20004, 'Invalid path for file');
                WHEN OTHERS THEN
                        RAISE_APPLICATION_ERROR(-20005, 'CLOSE_FILE Error in creating file. Message: ' || SQLERRM);
        END close_file;

        PROCEDURE open_file (
                prm_output_folder       IN              VARCHAR2,
                prm_output_file         IN              VARCHAR2)
        IS

        BEGIN
                cmn_file_handle := UTL_FILE.FOPEN (prm_output_folder, prm_output_file, 'a', 32767);
        EXCEPTION
                WHEN UTL_FILE.INVALID_FILEHANDLE THEN
                        close_file;
                        RAISE_APPLICATION_ERROR(-20000, 'File handle was invalid');
                WHEN UTL_FILE.INVALID_PATH THEN
                        close_file;
                        RAISE_APPLICATION_ERROR(-20001, 'Invalid path for file');
                WHEN OTHERS THEN
                        close_file;
                        RAISE_APPLICATION_ERROR(-20002, 'OPEN_FILE Error in creating file. Message: ' || SQLERRM);
        END open_file;

        FUNCTION change_datatype (
                 prm_value                       IN VARCHAR2,
                 prm_data_type                   IN VARCHAR2)
        RETURN VARCHAR2
        IS
        BEGIN
                IF prm_value IS NULL THEN
                        RETURN ('NULL');
                END IF;

                IF prm_data_type = 'C' THEN
                        IF INSTR(prm_value, CHR(10)) > 0 THEN
                                RETURN ('REPLACE(' || '''' || REPLACE (prm_value, CHR(10), CHR(977)) || '''' || ', CHR(977), CHR(10))');

                        END IF;
                ELSIF prm_data_type = 'D' THEN
                        RETURN ('TO_DATE(' || '''' || prm_value || '''' || ', ' || '''' || 'DD-MON-YYYY HH24:MI:SS' || '''' || ')');
                ELSIF prm_data_type = 'N' THEN
                        RETURN (prm_value);
                END IF;
                RETURN ('''' || prm_value || '''');
        EXCEPTION
                WHEN OTHERS THEN
                        RAISE_APPLICATION_ERROR(-20002, 'CHANGE_DATATYPE Error in Converting DataType. Message: ' || SQLERRM);
        END change_datatype;

        PROCEDURE generate_stmt (
                prm_table_name                  IN VARCHAR2,
                prm_where_clause                IN VARCHAR2,

                prm_output_folder               IN VARCHAR2,
                prm_output_file                 IN VARCHAR2)
        IS
                TYPE ref_cols IS REF CURSOR;
                mmy_ref_cols    ref_cols;

                mmy_column_name         VARCHAR2(100);
                mmy_column_data_type    VARCHAR2(1);
                mmy_col_string          VARCHAR2(32767);
                mmy_query_col_string    VARCHAR2(32767);
        BEGIN
                IF prm_table_name IS NULL OR
                   prm_output_folder IS NULL OR
                   prm_output_file IS NULL THEN
                        RAISE_APPLICATION_ERROR(-20012, 'Invalid Argument Passed');
                END IF;

                OPEN            mmy_ref_cols
                FOR             SELECT  LOWER(column_name) column_name,
                                                DECODE (data_type, 'VARCHAR2', 'C', 'CHAR', 'C', 'LONG', 'C', 'NUMBER', 'N', 'DATE', 'D')
data_type
                                FROM    user_tab_columns
                                WHERE   table_name = UPPER(prm_table_name)
                                ORDER BY  column_id;
                LOOP
                        FETCH mmy_ref_cols INTO mmy_column_name, mmy_column_data_type;
                        EXIT WHEN mmy_ref_cols%NOTFOUND;
                        mmy_col_string          := mmy_col_string || mmy_column_name || ', ';
                        IF mmy_column_data_type = 'D' THEN
                                mmy_query_col_string := mmy_query_col_string || 'change_datatype(' || 'TO_CHAR(' || mmy_column_name || ', ' || '''' || 'DD-MON-YYYY HH24:MI:SS' || '''' || ')' || ', ' || '''' || mmy_column_data_type || '''' || ') || ' || '''' || ', ' || '''' || ' || ';
                        ELSIF mmy_column_data_type IN ('N', 'C') THEN
                                mmy_query_col_string := mmy_query_col_string || 'change_datatype(' || mmy_column_name || ', ' || '''' || mmy_column_data_type || '''' || ') || ' || '''' || ', ' || '''' || ' || ';
                        END IF;

                END LOOP;
                CLOSE mmy_ref_cols;

                IF mmy_col_string IS NOT NULL AND
                   mmy_query_col_string IS NOT NULL THEN

                        IF NOT UTL_FILE.IS_OPEN(cmn_file_handle) THEN
                                open_file(prm_output_folder, prm_output_file);
                        END IF;

                        mmy_col_string                  := 'INSERT INTO ' || LOWER(prm_table_name) || ' (' || CHR(10) || CHR(9) || CHR(9) || mmy_col_string;
                        mmy_col_string                  := RTRIM (mmy_col_string, ', ');
                        mmy_col_string                  := mmy_col_string || ')' || CHR(10) || 'VALUES ( ' || CHR(9);
                        mmy_query_col_string    := RTRIM (mmy_query_col_string, ' || ' ||'''' || ',' || '''' || ' || ') || ' one_pare';

                        OPEN            mmy_ref_cols
                        FOR             ' SELECT        ' || mmy_query_col_string ||
                                        ' FROM  ' || prm_table_name ||

                                        ' ' || prm_where_clause;
                        LOOP
                                FETCH mmy_ref_cols INTO mmy_query_col_string;
                                EXIT WHEN mmy_ref_cols%NOTFOUND;
                                mmy_query_col_string := mmy_query_col_string || ');';
                                UTL_FILE.put (cmn_file_handle, mmy_col_string);
                                UTL_FILE.put_line (cmn_file_handle, mmy_query_col_string);
                        END LOOP;
                        CLOSE mmy_ref_cols;

                        If UTL_FILE.IS_OPEN(cmn_file_handle) THEN
                                close_file;
                        END IF;
                END IF;
        EXCEPTION
                WHEN UTL_FILE.INVALID_FILEHANDLE THEN
                        IF mmy_ref_cols%ISOPEN THEN
                                CLOSE mmy_ref_cols;
                        END IF;

                        close_file;
                        RAISE_APPLICATION_ERROR(-20009, 'File handle was invalid');
                WHEN UTL_FILE.INVALID_PATH THEN
                        IF mmy_ref_cols%ISOPEN THEN
                                CLOSE mmy_ref_cols;
                        END IF;
                        close_file;
                        RAISE_APPLICATION_ERROR(-20010, 'Invalid path for file');
                WHEN OTHERS THEN
                        IF mmy_ref_cols%ISOPEN THEN
                                CLOSE mmy_ref_cols;
                        END IF;
                        close_file;
                        RAISE_APPLICATION_ERROR(-20011, 'GENERATE_STMT Error in populating file. Message: ' || SQLERRM);
        END generate_stmt;
END utility;
/

Author Profile

sysdba ;

Other posts by sysdba

Author's web site



Are you satisfied with this blog?
Why not subscribe our RSS Feed? you will always get the latest post.


Hi, Be the first leave some reply

Leave A Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>




3 visitors online now
3 guests, 0 members
Max visitors today: 4 at 04:58 am CET
This month: 8 at 03-12-2010 05:51 pm CET
This year: 13 at 02-28-2010 05:55 am CET
All time: 14 at 12-23-2009 11:57 am CET