国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

使用utl_file將oracle數據庫中數據寫入excel文件

2024-08-29 13:44:52
字體:
來源:轉載
供稿:網友

  
    最近做的一個項目,其中有一塊的功能是將數據導出為Excel文件。我使用了Oracle的utl_file程序包。
主要實現思路:
    1、聲明一個紀錄,用來存儲導出的數據;
    2、使用游標取數據到紀錄中;
    3、使用utl_file將紀錄中的數據寫入excel文件;
    4、循環執行步驟2和3,完成數據的導出。
    做的過程中主要碰到的問題:
    1、excle文件中寫數據如何寫入下一列;
          使用TAB字符完成excel中橫向跳格,excel中TAB字符表示單元格的結尾,其中使用了chr()函數,
應用舉例如下:
         select U.USER_NAMEchr(9),U.ACCOUNTchr(9) from USER U
                                            例句1
          例句1作為游標的主體,取出的數據每項都包含一個TAB字符,使用utl_file.put()往excel文件中
寫數據時會自動跳格
    2、聲明的紀錄中各項的類型問題
           這個問題的產生主要是在類型的強轉化時產生。如例句1種的U.ACCOUNT為number型時,
添加chr(9)時oracle會對進行強轉化;當然這里的轉化不會有問題(number轉化為varchar2),
但是當這種強轉換還是會出現問題的,如聲明的紀錄里某個屬性聲明為用戶自己定義的一種類型,
oracle無法進行轉換,則會報錯。解決的辦法很簡單,可以將紀錄的屬性都聲明為varchar類型,但是要注重長度。
    3、導出文件存儲路徑問題
       utl_file在寫文件時,文件的存儲路徑必須在oracle初始化參數utl_file_dir中設置,
需重起服務才能生效。后來經過查資料發現可以先建立一個Directory,在存儲過程中使用它。
建立directory的語句:
create or replace directory FILEPATH as 'path' ";
例句2(注:path為存儲文件的路徑,如c:/Temp)

    以下是我簡單做的處理hr.jobs表數據的存儲過程:
      
CREATE OR REPLACE PROCEDURE SP_JOBS_DATA_OUT(
      p_file_name IN VARCHAR2           --***處理文件名稱,需包含擴展名(xls用于寫excel文件)***--
      ) as
     
   --***定義并聲明存儲交通資產信息的紀錄***--
   --***record_define start***--
    TYPE job_record_type is RECORD(
    job_id hr.jobs.job_id%TYPE,
    job_title hr.jobs.job_title%TYPE,
    min_salary varchar2(30)
    );
    job_rec job_record_type;
   --***record_define end***--
  
  
    --***定義獲取job信息的游標***--
   --***cursor_define start***--
    CURSOR c_jobs IS
     select
        job_idchr(9),      --***chr(9)是TAB字符,保證數據輸出到EXCEL時能自動換到下一列***--
        job_titlechr(9),
        min_salarychr(9)
    FROM
        hr.jobs;
   --***cursor_define end***--
   
    l_file utl_file.file_type;      --***處理文件操作的句柄***--
 
   
BEGIN
     l_file :=utl_file.fopen('FILEPATH',p_file_name,'w');    --FILEPATH是先于導出前用戶建立的存儲導出文件的路徑
     utl_file.put_line(l_file,'jobs表導出數據');
  
   OPEN c_jobs;
     LOOP 
     FETCH  c_jobs INTO   
            job_rec.job_id  ,
            job_rec.job_title ,
            job_rec.min_salary ;
         EXIT WHEN c_jobs%NOTFOUND;
            utl_file.put(l_file,job_rec.job_id );            --***數據寫入excle文件中***--
            utl_file.put(l_file,job_rec.job_title);
            utl_file.put_line(l_file,job_rec.min_salary);
               
     END LOOP;
   CLOSE  c_jobs;
     utl_file.fflush(l_file);
     utl_file.fclose(l_file);
  
   EXCEPTION
     WHEN others THEN
      IF utl_file.is_open(l_file) THEN
         utl_file.fclose(l_file);
       
      END IF;
END;
例句3(注:我的oracle版本為9.2)

這是我第一個blog,可能內容不是很有技術含量的說,但總希望記錄一下自己的歷程,分享大家的經驗。

MSN:lintaowen@hotmail.com

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金寨县| 松滋市| 宁阳县| 西宁市| 淮南市| 中卫市| 荔浦县| 阿荣旗| 白沙| 淳化县| 大竹县| 清徐县| 东丽区| 盐城市| 乌拉特后旗| 衡水市| 任丘市| 秦安县| 通山县| 台北市| 丰都县| 镶黄旗| 西峡县| 万山特区| 平阳县| 丘北县| 灵丘县| 英超| 潜山县| 大连市| 芮城县| 大同市| 芒康县| 英山县| 双流县| 桃园市| 灵石县| 青田县| 正安县| 库车县| 临汾市|