天天看點

Oracle導出1億資料csv,使用存儲過程将資料批量導出為多個csv檔案(ORACLE)-Oracle

使用存儲過程将資料批量導出為多個csv檔案(ORACLE)

資料庫有如下表結構:

user_info (

user_id           NUMBER primary key,

user_name     VARCHAR2(200) NOT NULL,

user_age        VARCHAR2(80),

create_date    DATE,

create_order   NUMBER

)

現在有100萬條記錄,要求每1000條記錄導出為一個csv檔案,内容用逗号分隔,共計1000個檔案,

檔案名稱格式為output1.csv,output1.csv……output1000.csv。

CREATE TABLE USER_INFO (

USER_ID        NUMBER PRIMARY KEY,

USER_NAME      VARCHAR2(200) not null,

USER_AGE       VARCHAR2(80),

CREATE_DATE    DATE,

CREATE_ORDER   NUMBER

)

declare i number;

v_age number;

begin

i:=0;

for i in 1..1000000 loop

–随機生成1~100的數字

select round(mod(dbms_random.value*100,100)) into v_age from dual;

insert into user_info(user_id,user_name,user_age,create_date,create_order)

values(SEQ_ALL_TABLE.NEXTVAL ,’翁林’||i,v_age,sysdate,i);

–每1000行送出一次

if mod(i,1000) = 0 then

commit;

end if;

end loop;

end;

create or replace procedure export_to_csv(

–1、入口參數部分

p_dir varchar2

)is

–2、内部變量部分

v_errorcode varchar2(30);

v_errormsg  varchar2(100);

–顯示遊标、一次性将資料全部讀完

cursor mycur is select * from user_info order by user_id; –如果不排序,你将發現寫入結果順序将達不到你的期望,該懂得的。

–行記錄

myrecord user_info%rowtype;

csv_output utl_file.file_type;

out_file_name varchar2(20);

begin_time number;

end_time number;

count_num number;

begin

–3、主體部分

begin_time :=dbms_utility.get_time;

open mycur;

for i in 1..1000 loop

out_file_name := ‘output’||i||’.csv’;

csv_output := utl_file.fopen(p_dir,out_file_name,’W’);

count_num := 0;

while count_num < 1000 loop –每1000行寫入一個檔案

fetch mycur into myrecord;

utl_file.put_line(csv_output

,myrecord.user_id|| ‘,’ ||

myrecord.user_name||’,’||

myrecord.user_age||’,’||

to_char(myrecord.create_date,’YYYY-MM-DD HH24:MI:SS’)||’,’||

myrecord.create_order);

count_num := count_num + 1;

end loop;

utl_file.fclose(csv_output);

end loop;

close mycur;

end_time := dbms_utility.get_time;

dbms_output.put_line(‘total time=’ || (end_time-begin_time)*10 || ‘ms.’);

–4、異常處理

exception

when others then

v_errorcode:=sqlcode;

v_errormsg :=sqlerrm;

rollback;

–輸出異常資訊

dbms_output.put_line(v_errorcode||v_errormsg);

end export_to_csv;

CREATE or replace DIRECTORY MYDIR AS ‘d:\tmp\’;

GRANT READ,WRITE ON DIRECTORY MYDIR TO wenglin;

exec export_to_csv(‘MYDIR’);