数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
使用utl_file将oracle数据库中数据写入excel文件

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

    最近做的一个项目,其中有一块的功能是将数据导出为excel文件。我使用了oracle的utl_file程序包。
主要实现思路:
    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)
这是我第一个blog,可能内容不是很有技术含量的说,但总希望记录一下自己的历程,分享大家的经验。
msn:[email protected]
 



相关文章

相关软件