hello all,
i am not very efficient in development activities, and i am asked to create a procedure to generating insert statement for each record, in each table for each column for migration purpose...
i know it is very difficult task, and i need to make a seperate .txt or .sql file for those insert statements,
how can i achieve this???? i have set UTL_FILE_DIR to guest_dir and grant permissions to specific user, now there are 415 tables in schema..
what i have done so far is.........
create or replace procedure insert_data is
l_srno NUMBER:=0;
l_chardate VARCHAR2(1000);
l_filename VARCHAR2(1000);
l_filehandle utl_file.file_type;
b_file utl_file.file_type;
l_ip VARCHAR2(100);
l_flag CHAR(1):='N';
RecordGroup varchar2(5000);
l_Str VARCHAR2(32767):= NULL;
l_Str1 VARCHAR2(32767):= 'SELECT ' ;
l_Cm_Tbl_Name VARCHAR2(32767):= NULL;
l_Rg_id RecordGroup%TYPE;
l_Rg_name VARCHAR2(40) := 'schema_name';
l_Rec_Cursor NUMBER;
l_Cur_Rec NUMBER := 0;
GroupColumn varchar2(5000);
l_Gc_Id GroupColumn%TYPE;
l_Data_Type VARCHAR2(50);
l_Length NUMBER(10);
l_Number_Type NUMBER;
l_Varchar_Type VARCHAR2(2000);
l_Date_Type DATE;
l_Rec_Status NUMBER;
L_COUNT NUMBER :=0;
CURSOR tablename IS
SELECT table_name
FROM user_tables;
CURSOR TableCol (a_tablename user_tables.table_name%TYPE) IS
SELECT column_name,
data_type
FROM user_tab_columns w
WHERE w.table_name=a_tablename
and column_name='CREATEDON';
begin
l_filehandle :=utl_file.fopen('guest_dir','insert.sql','W');
FOR k IN tablename
LOOP
FOR t IN TableCol(k.table_name)
LOOP
IF TableCol%ROWCOUNT=1 THEN
l_Str := t.column_name ;
l_Str1 := l_Str1||t.column_name ;
ELSE
l_Str := l_Str ||','||t.column_name ;
l_Str1 := l_Str1 ||','||t.column_name ;
END IF;
END LOOP;
l_Str1 := l_Str1||' '||' FROM '||k.table_name;
*IF Not Id_Null(l_Rg_id) THEN*
Delete_Group(l_Rg_id);
END IF;
MESSAGE(l_Str1);
MESSAGE(l_Str1);
l_Rg_id := Create_Group_From_Query(l_Rg_name,l_Str1);
l_Rec_Cursor := Populate_Group(l_Rg_id);
IF l_Rec_Cursor = 0 THEN
l_Cur_Rec := Get_Group_Row_Count( l_Rg_id );
SYNCHRONIZE;
FOR J IN 1..L_CUR_REC
LOOP
utl_file.new_line(l_filehandle);
utl_file.put(l_filehandle,'INSERT INTO '||K.table_name||' ('||l_Str ||' ) values ');
utl_file.new_line(l_filehandle);
utl_file.put(l_filehandle,'(');
FOR i IN TableCol(k.table_name)
LOOP
l_Gc_Id := FIND_COLUMN( l_Rg_Name||'.'||I.COLUMN_NAME);
IF NOT Id_Null(l_Gc_Id) THEN
SELECT DATA_TYPE,
DATA_LENGTH
INTO L_DATA_TYPE,
L_LENGTH
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = k.table_name
AND COLUMN_NAME = i.column_name ;
IF L_DATA_TYPE = 'VARCHAR2' OR L_DATA_TYPE = 'CHAR' THEN
L_VARCHAR_TYPE := GET_GROUP_CHAR_CELL( l_Gc_Id, j );
utl_file.PUT(l_filehandle,''''||(NVL(L_VARCHAR_TYPE,' '))||''''||',');
ELSIF L_DATA_TYPE = 'NUMBER' THEN
L_NUMBER_TYPE := GET_GROUP_NUMBER_CELL( l_Gc_Id, j );
utl_file.PUT(l_filehandle,(NVL(L_NUMBER_TYPE,' '))||',');
ELSIF L_DATA_TYPE = 'DATE' THEN
L_DATE_TYPE := GET_GROUP_DATE_CELL( l_Gc_Id, j );
utl_file.PUT(l_filehandle,'TO_DATE('''||NVL(To_Char(L_DATE_TYPE,'dd/mm/yyyy hh24:mi:ss'),' ')||','''||'dd-mon-rrrr hh24:mi'''||')'||',' );
END IF;
END IF;
l_Str1:='SELECT ';
END LOOP;
utl_file.put(l_filehandle,')');
utl_file.new_line(l_filehandle);
utl_file.put(l_filehandle,'COMMIT;');
utl_file.new_line(l_filehandle,1);
END LOOP;
END IF;
END LOOP;
utl_file.new_line(l_filehandle);
utl_file.put(l_filehandle,('EXIT'));
utl_file.fclose(l_filehandle);
Delete_Group(l_Rg_id);
EXCEPTION
WHEN FORM_TRIGGER_FAILURE THEN
utl_file.FCLOSE(l_filehandle);
RAISE;
WHEN OTHERS THEN
utl_file.FCLOSE(l_filehandle);
RAISE FORM_TRIGGER_FAILURE;
end insert_data;
and i am getting error "Error: PLS-00201: identifier 'ID_NULL' must be declared"
any suggestion will be valuable..
thanks and regards
VD