• 将oracle数据库中数据写入excel文件


     https://www.cnblogs.com/benio/archive/2011/11/21/2256923.html

     

    主要实现思路:
        1、声明一个纪录,用来存储导出的数据;
        2、使用游标取数据到纪录中;
        3、使用utl_file将纪录中的数据写入excel文件;
        4、循环执行步骤2和3,完成数据的导出。
        做的过程中主要遇到的问题:
        1、excle文件中写数据如何写入下一列;
              使用TAB字符完成excel中横向跳格,excel中TAB字符表示单元格的结尾,其中使用了chr()函数,
    应用举例如下:
             select U.USER_NAME||chr(9),U.ACCOUNT||chr(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_id||chr(9),      --***chr(9)是TAB字符,保证数据输出到EXCEL时能自动换到下一列***--
            job_title||chr(9),
            min_salary||chr(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)


    DECLARE
            FILE_ID TEXT_IO.FILE_TYPE;
            FILE_NAME VARCHAR2(200);
            FILE_CODE  VARCHAR2(100) :='BOM'||TO_CHAR(SYSDATE,'HHMISS');
            p_file_path varchar2(200);
      ln_count number;

    BEGIN
            FILE_NAME := '/prod/applprod/prodora/iAS/Apache/Apache/htdocs/lc_cust/'||FILE_CODE||'.xls';
            FILE_ID := TEXT_IO.FOPEN(FILE_NAME, 'w');

      TEXT_IO.PUT(FILE_ID,convert('父項料號','ZHT16BIG5','UTF8'));
      Text_IO.PUT(FILE_ID,chr(9));  
      TEXT_IO.PUT(FILE_ID,convert('子項料號','ZHT16BIG5','UTF8'));
      Text_IO.PUT(FILE_ID,chr(9));  
      TEXT_IO.PUT(FILE_ID,convert('子項料名','ZHT16BIG5','UTF8'));
      Text_IO.PUT(FILE_ID,chr(9));
      TEXT_IO.PUT(FILE_ID,convert('單位','ZHT16BIG5','UTF8'));
      Text_IO.PUT(FILE_ID,chr(9));
            TEXT_IO.PUT(FILE_ID,convert('單位用量','ZHT16BIG5','UTF8'));
            Text_IO.PUT(FILE_ID,chr(9));
            TEXT_IO.PUT(FILE_ID,convert('利用率','ZHT16BIG5','UTF8'));
            Text_IO.PUT(FILE_ID,chr(9));
            TEXT_IO.PUT(FILE_ID,convert('供給型態','ZHT16BIG5','UTF8'));
            Text_IO.PUT(FILE_ID,chr(9));
            TEXT_IO.PUT(FILE_ID,convert('供給倉庫','ZHT16BIG5','UTF8'));
            Text_IO.PUT(FILE_ID,chr(9));
            TEXT_IO.PUT(FILE_ID,convert('供給儲位','ZHT16BIG5','UTF8'));
            Text_IO.PUT(FILE_ID,chr(9));
            TEXT_IO.PUT(FILE_ID,convert('分類','ZHT16BIG5','UTF8'));        


           


            GO_BLOCK('CHECK_BOM_COMPONENT_PT');
            FIRST_RECORD;

      LOOP
            Text_IO.PUT(FILE_ID,chr(13));
            Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.ASSEMBLY_SEGMENT,' '),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.COMPONENT_SEGMENT,' '),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.COMPONENT_DESCRIPTION,' '),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.PRIMARY_UOM_CODE,' '),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.COMPONENT_QUANTITY,0),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.COMPONENT_YIELD_FACTOR,''),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.MEANING,''),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.SUBINVENTORY_CODE,''),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.INVENTORY_LOCATOR_SEGMENT,''),'ZHT16BIG5','UTF8'));
                     Text_IO.PUT(FILE_ID,chr(9));
                     Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.CATEGORY_SEGMENT,''),'ZHT16BIG5','UTF8'));                                         
                    
                     NEXT_RECORD;
            EXIT WHEN :SYSTEM.CURRENT_VALUE IS NULL;
      END LOOP;

      TEXT_IO.FCLOSE(FILE_ID);
      p_file_path :='http://erp.lacquercraft.com:8000/lc_cust/'||FILE_CODE||'.xls';
      Web.Show_Document(p_file_path, '_BLANK');
    END;

    20111213

    if l_attachtype = 'XLS' then
          l_mimetype := 'application/vnd.ms-excel';
      end if;
      if l_attachtype = 'DOC' then
          l_mimetype := 'application/vnd.ms-word';
      end if;
      if l_attachtype = 'PDF' then
          l_mimetype := 'application/pdf';
      end if;
      if l_attachtype in ('HTML','HTM') then
          l_mimetype := 'text/html';
      end if;


    Chr(9)    Tab

  • 相关阅读:
    实例图解SQL SERVER2000使用AWE进行内存优化
    使用Power Designer正反向数据库及生成设计报告
    使用SVN+CruiseControl+ANT实现持续集成之二环境搭建和配置介绍
    使用SVN+CruiseControl+ANT实现持续集成之三构建操作及监视
    【排序】排序算法之分配排序
    [Cocoa]自定义TableViewCell实现圆角/渐变色TableView
    [Cocoa]XCode 3.2 常用快捷键
    [Cocoa]实现了一套自定义动画库
    Vim 使用入门快捷键
    [Cocoa] iPhone/iPad 时区转换
  • 原文地址:https://www.cnblogs.com/shuihaya/p/15576118.html
Copyright © 2020-2023  润新知