日期:2014-05-16  浏览次数:20579 次

【转】oracle存储过程导出表数据为TXT文件【全表字段】

-*********************************************************************
--***
--***首先以dba或者是其他具有create directory的用户创建directory,然后授权。这一步很重要,否则后面执行存储过程会报异常
--***
--*********************************************************************
CREATE OR REPLACE DIRECTORY dir_jiang AS 'd:\oracle';
GRANT READ,WRITE ON directory dir_jiang TO scott;

--*********************************************************************
--***
--***执行导出文本文件的存储过程:p_exp
--***p_tname:要导出的表明;p_query:where条件,根据这个条件导出,如果为null,则全表导出
--***
--***
--*********************************************************************
CREATE OR REPLACE procedure p_exp(p_tname varchar2,p_query varchar2)
AS
? v_line? varchar2(2000);?????????????????????? --记录的数据
? v_sql??? varchar2(2000);????????????????????? --动态sql变量
? v_fname? varchar2(40);??????????????????????? --导出数据的文件名字
? cursor cursor_column????????????????????????? --游标:通过数据字典查找出表有哪些字段
??????? IS SELECT column_name,data_type
??????? FROM user_tab_columns WHERE table_name=upper(p_tname);
? type type_cursor IS ref cursor ;
? mycursor type_cursor;
? outf utl_file.file_type;

BEGIN
? v_fname:=p_tname||'.txt';??---此处的格式可以设置为.xls或是.doc格式的文件。
? FOR col IN cursor_column loop
??? IF col.data_type='DATE' THEN
????????? v_sql:=v_sql||'to_char('||col.column_name||',''yyyy-mm-dd-hh24:mi:ss'')'||'||chr(9)||';
??? ELSE
????????? v_sql:=v_sql||col.column_name||'||chr(9)||';
??? END IF;
? END loop;
? v_sql:=rtrim(v_sql,'||chr(9)||');
? v_sql:='select '||v_sql||' from '||p_tname||' '||p_query;
? dbms_output.put_line(v_sql);
? outf:=utl_file.fopen('DIR_JIANG',v_fname,'w');
? open mycursor FOR v_sql;
? loop
??? fetch mycursor INTO v_line;???
??? exit when mycursor%notfound;
??? utl_file.put_line(outf,v_line);
? END loop;
? utl_file.fclose(outf);
? dbms_output.put_line('导出成功');
END;原文地址:http://j2ee2009.javaeye.com/blog/677973?相关关键词搜索:oracle读写文件--利用utl_file包对磁盘文件的读写操作