您的位置:首页 > 数据库

导出数据库数据记录成insert语句的存储过程

2010-09-01 13:30 609 查看
借鉴了网上的一些方案,做了一个导出表或视图数据成insert语句的包:

CREATE OR REPLACE
PACKAGE pkg_ExportData
IS
FUNCTION getfields(
v_tname VARCHAR2)
RETURN VARCHAR2;
--v_tname 要输出的sql表名

PROCEDURE Print_insert(
v_filepath VARCHAR2,
v_filename VARCHAR2,
v_tname    VARCHAR2,
cbatch     NUMBER DEFAULT 0);
--v_filepath 文件保存路径
--v_filename 文件名
--v_tname 要输出sql的表名
--cbatch 输出commit的间隔
END pkg_ExportData;

CREATE OR REPLACE
PACKAGE BODY PKG_EXPORTDATA
AS
/* 求输入表的字段列表 */
FUNCTION getfields(
v_tname VARCHAR2)
RETURN VARCHAR2
AS
v_fields  VARCHAR2(8000);
v_columns VARCHAR2(8000);
BEGIN
FOR cur_fname IN
(SELECT cname,coltype FROM col WHERE tname = upper(v_tname) ORDER BY colno
)
LOOP
IF v_fields             IS NULL THEN
v_columns             :=cur_fname.cname;
IF cur_fname.coltype   ='DATE' THEN
v_fields            := 'decode(nvl('||cur_fname.cname||',''''),'''',''NULL'',to_date(''||'||cur_fname.cname||'||'',''yyyy-mm-dd hh24:mi:ss''))';
ELSIF cur_fname.coltype='VARCHAR2' OR cur_fname.coltype='CHAR' THEN
v_fields            :='decode(nvl('||cur_fname.cname||',''''),'''',''NULL'',''''''''||'||cur_fname.cname||'||'''''''')';
ELSE
v_fields := 'decode(nvl('||cur_fname.cname||',''''),'''',''NULL'','||cur_fname.cname||')';
END IF;
ELSE
v_columns             :=v_columns||','||cur_fname.cname;
IF cur_fname.coltype   ='DATE' THEN
v_fields            := v_fields||'||'',''||'||'decode(nvl('||cur_fname.cname||',''''),'''',''NULL'',to_date(''||'||cur_fname.cname||'||'',''yyyy-mm-dd hh24:mi:ss''))';
ELSIF cur_fname.coltype='VARCHAR2' OR cur_fname.coltype='CHAR' THEN
v_fields            :=v_fields||'||'',''||'||'decode(nvl('||cur_fname.cname||',''''),'''',''NULL'',''''''''||'||cur_fname.cname||'||'''''''')';
ELSE
v_fields := v_fields||'||'',''||'||'decode(nvl('||cur_fname.cname||',''''),'''',''NULL'','||cur_fname.cname||')';
END IF;
--v_fields := v_fields||'||'',''||'||cur_fname.cname;
--v_fields := v_columns||','||cur_fname.cname;
END IF;
END LOOP;
--v_fields:='select '||v_fileds||' from '||v_tname;
v_fields := 'select '||''''||'insert into '||v_tname||'('||v_columns||') values('||''''||'||'||v_fields||'||'||''''||');'||''''||' from '||v_tname;
RETURN v_fields;
END getfields;

/*将数据导出为insert into语句*/
PROCEDURE Print_insert(
v_filepath VARCHAR2,
v_filename VARCHAR2,
v_tname    VARCHAR2,
cbatch     NUMBER DEFAULT 0)
AS
type cur_alldata
IS
ref
CURSOR;
l_alldata cur_alldata;
v_sql VARCHAR2(8000);
v_row VARCHAR2(8000);
file_handle UTL_FILE.FILE_TYPE;
BEGIN
EXECUTE IMMEDIATE 'create or replace directory PRINTFILE as '''||v_filepath||'''';
EXECUTE IMMEDIATE 'alter session set nls_date_format='||''''||'yyyy-mm-dd hh24:mi:ss'||'''';
file_handle:=UTL_FILE.FOPEN('PRINTFILE',v_filename,'W',32767);
UTL_FILE.PUT_LINE(file_handle,'prompt Insert into '||v_tname||'...');
v_sql := getfields(v_tname);
--dbms_output.put_line(v_sql);
OPEN l_alldata FOR v_sql;
LOOP
FETCH l_alldata INTO v_row;
EXIT
WHEN l_alldata%notfound;
-- 输出sql语句
--dbms_output.put_line(v_row);
UTL_FILE.PUT_LINE(file_handle,v_row);
--dbms_output.put_line(formatdata(v_tname,v_row));
IF mod(l_alldata%rowcount,cbatch) = 0 THEN
--dbms_output.put_line('commit;');
UTL_FILE.PUT_LINE(file_handle,'commit;');
END IF;
END LOOP;
CLOSE l_alldata;
UTL_FILE.PUT_LINE(file_handle,'commit;');
UTL_FILE.FCLOSE(file_handle);
END Print_insert;
END PKG_EXPORTDATA;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐