|
-
Here is an example which generates 'Insert' statements for all tables in a scheema and saves SQL statements in a flat file which has the same name as a table.
-- set scan off;
exec dbms_output.enable;
set serveroutput on;
create or replace package dump_trax as
procedure dump_table(table_name_ IN varchar2);
procedure dump_all;
end;
/
create or replace package body dump_trax as
procedure dump_all as
CURSOR table_name_c IS SELECT table_name FROM user_tables;
tn table_name_c%ROWTYPE;
begin
open table_name_c;
LOOP
FETCH table_name_c into tn;
EXIT WHEN table_name_c%NOTFOUND;
dump_table(tn.table_name);
END LOOP;
close table_name_c;
end dump_all;
procedure dump_table(table_name_ IN varchar2) as
stmt varchar2(200) := 'select column_name from user_tab_columns where table_name = '''|| table_name_ ||'''';
stmt_c integer; -- := dbms_sql.open_cursor;
stmt_c1 integer; -- := dbms_sql.open_cursor;
dummy_int integer;
column_name_ varchar2(30);
data_type_ varchar2(106);
data_length_ number;
prows number;
pstatus numeric;
v_FileHandle UTL_FILE.FILE_TYPE;
v_FileError UTL_FILE.FILE_TYPE;
stmt1 varchar2(200) := 'select rowid as row_id from '||table_name_;
stmt11 integer := dbms_sql.open_cursor;
row_id varchar2(18);
tmp varchar2(4000);
data_ varchar2(4000);
com NUMBER := 0;
com_int NUMBER := 100;
path VARCHAR2(200) := '/u02/we/admin/trax_sql'; -- 'C:\Temp'; --'C:\temp\trax_sql'
cursor help_c is
select column_name,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name = table_name_;
help_var help_c%ROWTYPE;
begin
dbms_sql.parse(stmt11, stmt1, dbms_sql.native);
dbms_sql.define_column(stmt11, 1, row_id, 18);
dummy_int := dbms_sql.execute(stmt11);
-- v_FileHandle := UTL_FILE.FOPEN('C:\temp\trax_sql', table_name_ || '.sql', 'w');
v_FileHandle := UTL_FILE.FOPEN(path, table_name_ || '.sql', 'w');
while (dbms_sql.fetch_rows(stmt11) > 0)
LOOP
dbms_sql.column_value(stmt11, 1, row_id);
UTL_FILE.PUTF(v_FileHandle, '%s\n','insert into ' || table_name_ ||'(');
--------------------------------------------------------------------------
stmt_c := dbms_sql.open_cursor;
dbms_sql.parse(stmt_c, stmt, dbms_sql.native);
dbms_sql.define_column(stmt_c, 1, column_name_, 30);
dummy_int := dbms_sql.execute(stmt_c);
tmp := '';
while (dbms_sql.fetch_rows(stmt_c) > 0)
LOOP
dbms_sql.column_value(stmt_c, 1, column_name_);
tmp := tmp || column_name_ ||','|| chr(10);
END LOOP;
dbms_sql.close_cursor(stmt_c);
UTL_FILE.PUTF(v_FileHandle, '%s\n', SUBSTR(tmp,1,length(tmp) - 2) || ') values(');
--------------------------------------------------------------------------
OPEN help_c;
LOOP
FETCH help_c into help_var;
EXIT WHEN help_c%NOTFOUND;
BEGIN
stmt_c1 := dbms_sql.open_cursor;
tmp := 'select distinct decode(c.data_type,''VARCHAR2'',replace(m.'|| help_var.column_name;
tmp := tmp ||',chr(39),chr(39)||chr(39)),''NUMBER'',to_char('|| help_var.column_name;
tmp := tmp ||'),''DATE'',to_char(m.'|| help_var.column_name ||'),'''') as data_ from ';
tmp := tmp || table_name_ ||' m, user_tab_columns c where c.column_name = ''';
tmp := tmp || help_var.column_name ||''' and c.table_name = ''' || table_name_ || ''' and m.rowid = '''||row_id||'''';
dbms_sql.parse(stmt_c1, tmp, dbms_sql.native);
dbms_sql.define_column(stmt_c1, 1, data_, 4000);
dummy_int := dbms_sql.execute(stmt_c1);
dummy_int := dbms_sql.fetch_rows(stmt_c1);
dbms_sql.column_value(stmt_c1, 1, data_);
IF help_c%ROWCOUNT > 1 then
UTL_FILE.PUTF(v_FileHandle, '%s\n', ',''' || data_ || '''');
else
UTL_FILE.PUTF(v_FileHandle, '%s\n', '''' || data_ || '''');
end if;
dbms_sql.close_cursor(stmt_c1);
EXCEPTION WHEN OTHERS THEN
UTL_FILE.PUTF(v_FileHandle, '%s\n', ',''''');
tmp := SQLERRM;
v_FileError := UTL_FILE.FOPEN(path, 'error_log.txt', 'a');
UTL_FILE.PUTF(v_FileError, '%s\n', 'Error for table : ' || table_name_);
UTL_FILE.PUTF(v_FileError, '%s\n', 'Column NAME : ' || help_var.column_name);
UTL_FILE.PUTF(v_FileError, '%s\n', 'Column TYPE : ' || help_var.data_type);
UTL_FILE.PUTF(v_FileError, '%s\n', 'Column LENGTH : ' || help_var.data_length);
UTL_FILE.PUTF(v_FileError, '%s\n', tmp);
tmp := SQLCODE;
UTL_FILE.PUTF(v_FileError, '%s\n', 'SQLCODE: ' || tmp);
UTL_FILE.PUTF(v_FileError, '%s\n', '------------------------------------------------');
UTL_FILE.FCLOSE(v_FileError);
END;
END LOOP;
-- dbms_sql.close_cursor(stmt_c);
CLOSE help_c;
--------------------------------------------------------------------------
UTL_FILE.PUTF(v_FileHandle, '%s\n', ');');
UTL_FILE.PUTF(v_FileHandle, '%s\n', '');
com := com + 1;
if com >= com_int then
UTL_FILE.PUTF(v_FileHandle, '%s\n', 'COMMIT;');
UTL_FILE.PUTF(v_FileHandle, '%s\n', '');
com := 0;
end if;
END LOOP; -- row_id
dbms_sql.close_cursor(stmt11);
UTL_FILE.PUTF(v_FileHandle, '%s\n', 'COMMIT;');
UTL_FILE.PUTF(v_FileHandle, '%s\n', '');
UTL_FILE.PUTF(v_FileHandle, '%s\n', '-- DONE');
UTL_FILE.FCLOSE(v_FileHandle);
EXCEPTION WHEN OTHERS THEN
-- dbms_sql.close_cursor(stmt11);
-- dbms_output.put_line('Error: ' || table_name_);
tmp := SQLERRM;
v_FileError := UTL_FILE.FOPEN(path, 'error_log.txt', 'a');
UTL_FILE.PUTF(v_FileError, '%s\n', 'Error for table : ' || table_name_);
UTL_FILE.PUTF(v_FileError, '%s\n', tmp);
tmp := SQLCODE;
UTL_FILE.PUTF(v_FileError, '%s\n', 'SQLCODE: ' || tmp);
UTL_FILE.PUTF(v_FileError, '%s\n', '------------------------------------------------');
UTL_FILE.FCLOSE(v_FileError);
end;
end dump_trax;
/
show errors;
Best wishes!
Dmitri
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|