需求:把oracle數據庫中符合條件的n多表,導出成csv文本文件,並以表名.csv為文件名存放。
實現:通過存儲過程中utl_file函數來實現。導出的csv文件放入提前創建好的directory中。使用方法:使用以下命令數據預執行的sql腳本
select 'exec sql_to_csv(''select * from ' ||t.table_name ||
''',''out_put_csv''' || ',''' || t.table_name ||'.csv'');'
from user_tables t
實例:exec sql_to_csv('select * from ip_role','backup/oracle/csv','ip_role.csv');
重點:當使用一下的存儲過程執行的時候,報存在相關目錄的時候 請在oracle 的啟動文件的末尾中添加你要下載到的目錄中
例如: utl_file_dir='/backup/oracle/cvs' 到 /oracle/projuct/11.2.0/dbhome_1/init.ora 文件中
腳本說明:sql_to_csv 存儲過程名;out_put_csv數據庫目錄名稱;ods_mds預定義的schema名稱;
存儲過程代碼如下:
create or replace procedure chenqy.sql_to_csv
(
p_query in varchar2, -- plsql查詢sql語句
p_dir in varchar2, -- 導出的文件放置目錄
p_filename in varchar2 -- csv名
)
is
l_output utl_file.file_type;
l_thecursor integer default dbms_sql.open_cursor;
l_columnvalue varchar2(4000);
l_status integer;
l_colcnt number := 0;
l_separator varchar2(1);
l_desctbl dbms_sql.desc_tab;
p_max_linesize number := 32000;
begin
--open file
l_output := utl_file.fopen(p_dir, p_filename, 'w', p_max_linesize);
--define date format
execute immediate 'alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''';
--open cursor
dbms_sql.parse(l_thecursor, p_query, dbms_sql.native);
dbms_sql.describe_columns(l_thecursor, l_colcnt, l_desctbl);
--dump table column name
for i in 1 .. l_colcnt loop
utl_file.put(l_output,l_separator || '' || l_desctbl(i).col_name || ''); --輸出表頭部字段名
dbms_sql.define_column(l_thecursor, i, l_columnvalue, 4000);
l_separator := ',';
end loop;
utl_file.new_line(l_output); --輸出表字段頭部字段名
--execute the query statement
l_status := dbms_sql.execute(l_thecursor);
--dump table column value
while (dbms_sql.fetch_rows(l_thecursor) > 0) loop
l_separator := '';
for i in 1 .. l_colcnt loop
dbms_sql.column_value(l_thecursor, i, l_columnvalue);
utl_file.put(l_output,l_separator || '' ||trim(both ' ' from replace(l_columnvalue, '"', '""')) || '');--輸出表對應的表數據
l_separator := ',';
end loop;
utl_file.new_line(l_output);--寫入cvs行
end loop;
--close cursor
dbms_sql.close_cursor(l_thecursor);
--close file
utl_file.fclose(l_output);
exception
when others then
raise;
end;
