借鉴了网上的一些方案,做了一个导出表或视图数据成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;