资源描述:
《Oracle使用UTL_FILE文件包大批量数据导出到CSV(Excel)文件.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Oracle使用UTL_FILE文件包大批量数据导出到CSV(Excel)文件1.创建测试表CREATETABLESCOTT.EMP1ASSELECT*FROMSCOTT.EMP;CREATETABLESCOTT.EMP2ASSELECT*FROMSCOTT.EMP;创建多张表,模拟多张表操作。2.创建初始化表CREATETABLESCOTT.EXP_TMP(T_SQLVARCHAR2(100));这张表保存了存储过程执行过程中需要执行的sql语句,格式为select*fromtable_name(注意:一定不能加分号)。3.初始化数据INSER
2、TINTOSCOTT.EXP_TMPSELECT'SELECT*FROM'
3、
4、T.TABLE_NAME
5、
6、''FROMDBA_TABLESTWHEREREGEXP_LIKE(TABLE_NAME,'^EMP[0-9]*')ANDowner='SCOTT'ORDERBY1;UPDATESCOTT.EMP1SETEMPNO='1'WHEREEMPNO='7369';UPDATESCOTT.EMP1SETEMPNO='2'WHEREEMPNO='7499';UPDATESCOTT.EMP1SETEMPNO='3'WHEREEMPNO='7521';UP
7、DATESCOTT.EMP2SETEMPNO='4'WHEREEMPNO='7369';UPDATESCOTT.EMP2SETEMPNO='5'WHEREEMPNO='7499';UPDATESCOTT.EMP2SETEMPNO='6'WHEREEMPNO='7521';COMMIT;根据需要调整需要导出数据的表(通过调整sql语句实现)。4.创建目录及授权CREATEORREPLACEdirectorydump_dirAS'/home/oracle/';grantread,writeondirectorydump_dirtoscott;如果目录
8、已存在,只需要授权即可5.创建存储过程CREATEORREPLACEPROCEDURESCOTT.EXPORT_TO_CSVISP_QUERYVARCHAR2(100);P_DIRVARCHAR2(10):='DUMP_DIR';P_FILENAMEVARCHAR2(20):='emp.csv';L_OUTPUTUTL_FILE.FILE_TYPE;L_THECURSORINTEGERDEFAULTDBMS_SQL.OPEN_CURSOR;L_COLUMNVALUEVARCHAR2(4000);L_STATUSINTEGER;L_COLCNTNU
9、MBER:=0;L_SEPARATORVARCHAR2(1);L_DESCTBLDBMS_SQL.DESC_TAB;L_COUNTNUMBER:=0;CURSORMYCURISSELECTT_SQLFROMSCOTT.EXP_TMPORDERBY1;BEGIN--OPENFILEL_OUTPUT:=UTL_FILE.FOPEN(P_DIR,P_FILENAME,'a',32767);--TABLECOUNTSELECTCOUNT(*)INTOL_COUNTFROMSCOTT.EXP_TMPORDERBY1;--记录条数--OPENCURSOROP
10、ENMYCUR;FORJIN1..L_COUNTLOOP--最外层循环为表的个数FETCHMYCURINTOP_QUERY;--DBMS_OUTPUT.PUT_LINE(P_QUERY);--DEFINEDATEFORMATEXECUTEIMMEDIATE'ALTERSESSIONSETNLS_DATE_FORMAT=''YYYY-MM-DDHH24:MI:SS''';--OPENCURSORDBMS_SQL.PARSE(L_THECURSOR,P_QUERY,DBMS_SQL.NATIVE);DBMS_SQL.DESCRIBE_COLUMNS(
11、L_THECURSOR,L_COLCNT,L_DESCTBL);--DBMS_OUTPUT.PUT_LINE(L_THECURSOR);--DUMPTABLECOLUMNNAMEL_SEPARATOR:='';FORIIN1..L_COLCNTLOOP--循环为表的列数UTL_FILE.PUT(L_OUTPUT,L_SEPARATOR
12、
13、'"'
14、
15、L_DESCTBL(I).COL_NAME
16、
17、'"');--输出表字段DBMS_SQL.DEFINE_COLUMN(L_THECURSOR,I,L_COLUMNVALUE,4000);L_SEPARAT
18、OR:=',';ENDLOOP;UTL_FILE.NEW_LINE(L_OUTPUT);--输出表字段--EXECUTETHEQUERY