簡體   English   中英

通過使用過程將表導出到csv文件(帶時間戳的csv名稱)

[英]Export table to csv file by using procedure (csv name with timestamp)

我想將一個表導出到每個csv文件,並用時間戳命名該csv文件。 例如,如果我有一個表t1 ,則在導出后,將生成一個csv文件名t1.YYYYMMDDHHMISS.csv。 這是我的代碼:

create or replace procedure 
T_to_CSV(Tname varchar2,Directory varchar2)

BEGIN

set colsep ,     -- separate columns with a comma
set pagesize 0   -- No header rows
set trimspool on -- remove trailing blanks
set headsep off  -- this may or may not be useful...depends on your 

spool timestamp.csv --don't know how to write in directory

select *
  from Tname

end

這是我的問題:

(1)我不知道如何將csv文件輸出到需要的目錄中,請如何解決假脫機代碼?

我應該使用假脫機D:\\path\\filename.csv嗎?

(2)在假脫機行中,如何使用時間戳now()更改csv文件的名稱?

有幾個步驟:

  • 創建一個目錄使用`創建目錄MY_DIR為“C:\\ DIR”;
  • 確保Oracle已在計算機上的文件夾上進行讀寫操作(最好通過在Oracle安裝文件夾中創建文件夾來完成此操作)
  • 授予執行程序GRANT read,write on DIRECTORY my_dir to the_user;的用戶GRANT read,write on DIRECTORY my_dir to the_user;
  • 在此處下載並編譯便捷程序

我已經用過了,效果很好。

用法

data_dump ( 'Select emp_name from emp',
             CURRENT_TIMESTAMP||'filename.csv',
             my_dir);

(大大簡化了示例!)

創建目錄后,通過運行以下命令驗證您的工作:

  • 從ALL_DIRECTORIES中選擇*;
  • 你應該看到你的目錄
  • 登錄到數據庫所在的計算機,並驗證文件夾路徑是否存在以及oracle用戶對其具有權限。 僅當運行oracle服務的用戶對該文件夾具有權限時,才可以使用網絡驅動器
  • 將文件保存並復制到目錄{文件不必是可執行文件}
  • 導出數據庫實例的ORACLE_HOME,PATH和SID
  • 導航到該目錄並執行sqlplus
  • 假脫機文件將與.sql文件創建在同一目錄中

     SET COLSEP , SET HEADSEP OFF -- character used when defining a two-line column heading SET TRIMSPOOL ON -- trim trailing spaces from each line SET LINESIZE 32000 -- number of characters to be printed on one line SET WRAP OFF -- truncates lines longer than LINESIZE SET NUMWIDTH 5 -- default width while displaying numbers COLUMN tm new_value iso8601 noprint SELECT to_char(sysdate, 'YYYY-MM-DD') tm FROM dual; spool output_file_&iso8601..csv -- Append new data to spool file: "spool output_file_&iso8601..csv append" SELECT * FROM table_name spool OFF 

感謝kevin分享了該過程,這對我非常有用。 我已自定義代碼:

  1. 要在輸出csv文件中添加以前不起作用的列名。
  2. 當我將定界符作為參數傳遞時,它將在已更正的每行(,1,2,3)的開頭添加逗號。

我還分享了可能對他人有幫助的自定義代碼。 定制代碼可在此處下載。

  1. 自定義代碼以添加列名
  FOR i IN t_describe.FIRST .. t_describe.LAST LOOP IF i <> t_describe.LAST THEN put('UTL_FILE.PUT(v_fh,'''||t_describe(i).col_name||'''||'''||v_delimiter||''');'); ELSE put(' UTL_FILE.PUT(v_fh,'''||t_describe(i).col_name||''');'); END IF; END LOOP; put(' UTL_FILE.NEW_LINE(v_fh);'); 
  1. 分隔符的定制代碼

    如果我<> t_describe.LAST THEN
    put('UTL_FILE.PUT(v_fh,“'|| t_describe(i).col_name ||'”(i)||''|| v_delimiter ||'');');;
    其他
    put('UTL_FILE.PUT(v_fh,“'|| t_describe(i).col_name ||'”(i));');
    萬一;

調用該過程的正確方法是將變量與值綁定

data_dump(query_in =>'從對偶中選擇1',file_in =>'file.csv',directory_in =>'MY_DIR',delimiter_in =>'|');

謝謝

納文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM