分享
 
 
 

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

王朝oracle·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

最近做的一个项目,其中有一块的功能是将数据导出为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,可能内容不是很有技术含量的说,但总希望记录一下自己的历程,分享大家的经验。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有