ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用utl_file将oracle数据库中数据写入excel文件(转)

使用utl_file将oracle数据库中数据写入excel文件(转)

原创 Linux操作系统 作者:jcszjswkzhou 时间:2019-07-02 22:12:04 0 删除 编辑
使用utl_file将oracle数据库中数据写入excel文件,sql,sql教程,Oracle基础

最近做的一个项目其中有一块的功能是将数据导出为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)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-122247/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-08-29

  • 博文量
    3481
  • 访问量
    2849031