oracle 导出csv文件

用oracle的UTL_FILE包导出表数据为CSV文件步骤 执行该存储过程之前,UTL_FILE的目录必须以sysdba的用户创建,然后授权给使用的用户,代码中的MYDIR通过下面方法创建: 首先,以sysdba用户登录。 其次,创建目录,如:CREATE DIRECTORY MYDIR AS 'c:\oraload\'; 文件的输出目录只能是在oracle所在的服务器上,oracle用户有权限操作此目录。 最后,给用户授权,如:GRANT READ,WRITE ON DIRECTORY MYDIR TO scott;

create or replace procedure export_to_csv(P_DIR IN VARCHAR2)
is
CSV_OUTPUT UTL_FILE.FILE_TYPE;
MAX_LINE NUMBER := 1000; --此处设置为每个文件1000行,只导出一个文件不用设置,否则行数多余1000会报错。
OUT_FILE_NAME varchar2(20);
OBJ_SIZE NUMBER;
MIN_RECORD NUMBER;
MAX_RECORD NUMBER;
OBJ_DATE varchar2(100);
BEGIN_TIME NUMBER;
END_TIME NUMBER;
begin
BEGIN_TIME := dbms_utility.get_time;--记录开始时间,注意dbms_utility.get_time获取的时间戳单位是1/100s
FOR I IN 0..999 loop
OUT_FILE_NAME := 'output' || I ||'.csv';--拼接文件名
MIN_RECORD := i*1000 + 1;--分页查询起始记录
MAX_RECORD := (i+1)*1000;--分页查询中止记录
--以写方式打开指定目录中指定文件名文件
CSV_OUTPUT := UTL_FILE.FOPEN(P_DIR, OUT_FILE_NAME, 'W', MAX_LINE);--此处设置为每个文件1000行,只导出一个文件不用设置MAX_LINE,否则行数多余1000会报错。
--隐式游标,每次查询1000条记录
FOR cur IN (SELECT * FROM(SELECT A.*, ROWNUM rn FROM(SELECT * FROM aaa)A WHERE ROWNUM <= MAX_RECORD) WHERE rn >= MIN_RECORD) LOOP
OBJ_SIZE := cur.OBJ_SIZE*10 + cur.MS_VERSION;
--将数值类型数据转换为日期字符串
OBJ_DATE := TO_CHAR(TO_DATE('19700101','yyyymmdd') + cur.OBJ_TIME/86400,'yyyy-MM-dd HH24:mi');
--写文件
UTL_FILE.PUT_LINE(CSV_OUTPUT,cur.OBJ_ID || '|' || cur.OBJ_NAME || ',' || OBJ_SIZE || ',' || OBJ_DATE || ',' || cur.OBJ_NAME);
END LOOP;
UTL_FILE.FCLOSE(CSV_OUTPUT);
END LOOP;
END_TIME := dbms_utility.get_time;
DBMS_output.put_line('Total time=' || (END_TIME-BEGIN_TIME)*10 || 'ms.');
END;
/
begin
export_to_csv('MYDIR');
end;
/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值