lundi 18 janvier 2010

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;
/

1 commentaire:

  1. Антон Павлович22 mars 2010 à 09:01

    The GENERATE_STMT procedure of this UTILITY package needs four parameters i.e.....

    Вы попали в самую точку. Мне кажется это очень хорошая мысль. Полностью с Вами соглашусь....

    RépondreSupprimer