国产探花免费观看_亚洲丰满少妇自慰呻吟_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

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 朝阳区| 城口县| 昆明市| 雅安市| 浠水县| 饶阳县| 大足县| 施秉县| 金乡县| 吴江市| 资溪县| 湘潭县| 左云县| 玛多县| 顺义区| 凤庆县| 革吉县| 耒阳市| 莆田市| 南江县| 乌拉特后旗| 余姚市| 姜堰市| 怀柔区| 上饶县| 旺苍县| 教育| 洛阳市| 康保县| 德保县| 天峨县| 高淳县| 金山区| 科技| 海南省| 东海县| 大埔县| 彩票| 榆树市| 五大连池市| 辽阳市|