-使用下面的匿名pl/sql块可以实现批量卸载数据,此处不演示
DECLARE
l_rows NUMBER;
v_sql VARCHAR2 (200);
CURSOR cur_tab
IS
SELECT table_name FROM user_tables;-->这里定义需要卸载的表,可以单独指定一个表用于存放需要卸载的对象,此处直接查询数据字典
BEGIN
FOR tab_name IN cur_tab
LOOP
v_sql := 'select * from ' || tab_name.table_name;
l_rows :=
unloader.run (p_query => v_sql,
p_tname => tab_name.table_name,
p_mode => 'replace',
p_dir => 'DB_DUMP_DIR',
p_filename => tab_name.table_name,
p_separator => ',',
p_enclosure => '"',
p_terminator => '~');
-- Author : Leshami
-- Blog : http://blog.csdn.net/leshami
DBMS_OUTPUT.put_line (TO_CHAR (l_rows) || ' rows extracted to ascii file');
END LOOP;
END;
/
3、卸载数据原始脚本
robin@SZDB:~/dba_scripts/custom/tom> more unloader_pkg.sql
CREATE OR REPLACE PACKAGE unloader
AUTHID CURRENT_USER
AS
/* Function run -- unloads data from any query into a file
and creates a control file to reload that
data into another table
--注释信息给出了比较详细的描述
p_query = SQL query to "unload". May be virtually any query.
p_tname = Table to load into. Will be put into control file.
p_mode = REPLACE|APPEND|TRUNCATE -- how to reload the data
p_dir = directory we will write the ctl and dat file to.
p_filename = name of file to write to. I will add .ctl and .dat
to this name
p_separator = field delimiter. I default this to a comma.
p_enclosure = what each field will be wrapped in
p_terminator = end of line character. We use this so we can unload
and reload data with newlines in it. I default to
"|\n" (a pipe and a newline together) and "|\r\n" on NT.
You need only to override this if you believe your
data will have that sequence in it. I ALWAYS add the
OS "end of line" marker to this sequence, you should not
*/
FUNCTION run (p_query IN VARCHAR2,
p_tname IN VARCHAR2,
p_mode IN VARCHAR2 DEFAULT 'REPLACE',
p_dir IN VARCHAR2,
p_filename IN VARCHAR2,
p_separator IN VARCHAR2 DEFAULT ',',
p_enclosure IN VARCHAR2 DEFAULT '"',
p_terminator IN VARCHAR2 DEFAULT '|')
RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY unloader
AS
g_thecursor INTEGER DEFAULT DBMS_SQL.open_cursor;
g_desctbl DBMS_SQL.desc_tab;
g_nl VARCHAR2 (2) DEFAULT CHR (10);
FUNCTION to_hex (p_str IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR (ASCII (p_str), 'fm0x');
END;
FUNCTION is_windows
RETURN BOOLEAN
IS
l_cfiles VARCHAR2 (4000);
l_dummy NUMBER;
BEGIN
IF (DBMS_UTILITY.get_parameter_value ('control_files', l_dummy, l_cfiles) > 0)
THEN
RETURN INSTR (l_cfiles, '\') > 0;
ELSE
RETURN FALSE;
END IF;
END;
PROCEDURE dump_ctl (p_dir IN VARCHAR2,
p_filename IN VARCHAR2,
p_tname IN VARCHAR2,
p_mode IN VARCHAR2,
p_separator IN VARCHAR2,
p_enclosure IN VARCHAR2,
p_terminator IN VARCHAR2)
IS
l_output UTL_FILE.file_type;
l_sep VARCHAR2 (5);
l_str VARCHAR2 (5) := CHR (10);
BEGIN
IF (is_windows)
THEN
l_str := CHR (13) || CHR (10);
END IF;
l_output := UTL_FILE.fopen (p_dir, p_filename || '.ctl', 'w');
UTL_FILE.put_line (l_output, 'load data');
UTL_FILE.put_line (l_output, 'infile ''' || p_filename || '.dat'' "str x''' || UTL_RAW.cast_to_raw (p_terminator || l_str) || '''"');
UTL_FILE.put_line (l_output, 'into table ' || p_tname);
UTL_FILE.put_line (l_output, p_mode);
UTL_FILE.put_line (l_output, 'fields terminated by X''' || to_hex (p_separator) || ''' enclosed by X''' || to_hex (p_enclosure) || ''' ');
UTL_