Oracle中表資料行數過多匯出為CSV檔案的方法

2021-08-20 11:57:23 字數 2584 閱讀 9858

需求:

需要將oracle資料庫中的乙個表匯出為csv檔案,但是表比較大,共有29488763條資料,不能通過簡單的plsql查詢在轉成csv檔案的方法,該錶匯出的dmp檔案,約有2.3g,匯出的csv檔案有3.4g。

解決思路:

寫乙個儲存過程,把sql查詢出來的結果使用格式轉換的方式轉換成csv格式的檔案。

如下:----oracle中表資料行數過多匯出為csv檔案的方法如下:

---登入system使用者

---建立匯出csv方法的儲存過程,system使用者下執行

create or replace procedure sql_to_csv  

(  p_query in varchar2, 

p_dir in varchar2,

p_filename in varchar2 

)  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);  

end loop;  

--close cursor  

dbms_sql.close_cursor(l_thecursor);  

--close file  

utl_file.fclose(l_output);  

exception  

when others then  

raise;  

end;  

/---建立匯出目錄,該目錄為oracle資料庫所在伺服器或者主機目錄。

create or replace directory out_path as 'd:\';

---為system使用者賦予匯出目錄out_path的讀寫許可權

---登入sys使用者,或者其他dba使用者

grant read,write on directory out_path to system;

----登入system使用者,執行匯出操作(總共執行約40分鐘)

exec sql_to_csv('select * from llsj.dw_gs_sfztxcl','out_path','dw_gs_sfztxcl.csv');

Oracle連線數過多釋放機制

sqlplus nolog 開啟sqlplus connect as sysdba 使用具有dba許可權得使用者登陸oracle show parameter resource limit 顯示資源限定是否開啟,value為true是開啟,為false是關閉 alter system set res...

Sybase資料庫連線數過多問題

我們的開發團隊增加到10多人後,由於共享乙個資料庫,導致先連線上的能連上,後連線上的就連線不上了,經過上網搜尋相關資料,由於 sybase 預設的連線數只有 20個,需要設定多一些連線數,在 sybase 資料庫設定中選擇 number of remote connections 和 number ...

資料庫連線數過多,頁面打不開

當使用者收到鏈結數告警時,意味著連線數即將達到該例項的上限。如果例項的連線數超過了例項規定的連線數,將無法建立新的連線,這個時候會影響使用者的業務 mysql 的連線通常是乙個請求占用乙個連線,如果該請求 update,insert,delete,select 長時間沒有執行完畢,則會造成連線的堆積...