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;
/
The GENERATE_STMT procedure of this UTILITY package needs four parameters i.e.....
RépondreSupprimerВы попали в самую точку. Мне кажется это очень хорошая мысль. Полностью с Вами соглашусь....