利用utl_file包进行表数据导出

2013/11/12

一、概述

工作中需要将许多表的数据导出到一份excel中,虽然PL/SQL自带有导出的功能,但是导出后需要进行手动的汇总到一张excel中,比较耗时。此时就可以利用oracle自带的utl_file包完成此工作。它可以将不同表的相关数据导出到一张excel里,省去了后续的工作。

------------------------------------------------------------------------------------

二、实验步骤

1.导入utl_file包。

以sys用户在command窗口执行如下SQL脚本即可。

utlfile.sql

2.建立文件导出目录并赋予读写权限

create or replace directory data_out as 'd:\';

grant read ,write on directory data_out to scott;

3.对scott用户赋予执行utl_file包的权限。

grant execute on utl_file to scott;

4.修改utl_file_dir参数,此参数为静态参数,然后重启数据库。

alter system set utl_file_dir = 'd:\' scope = spfile;

5.创建存储过程进行表数据导出

create or replace procedure

export_2_excel(pfile_name in varchar2,

--输出文件名

pexport_sql in varchar2) --执行的sql语句 ‘select

empno||chr(9),ename||chr(9) from emp’

--chr(9)是制表符。

as

--存储记录的对象类型

type content_record_type is record(

empno

varchar2(25),

ename

varchar2(25),

job varchar2(25),

sal varchar2(25));

content_re content_record_type;

--建立游标

type cur_content is ref cursor;

c_content cur_content;

l_file utl_file.file_type; --建立操作文件的句柄

begin

l_file := utl_file.fopen('d:\', pfile_name ||

'.xls', 'w'); --打开文件'

utl_file.put_line(l_file,

'empno' || chr(9) || 'ename' || chr(9) || 'job' ||

chr(9) || 'sal'); --输出标头

open c_content for pexport_sql; --打开游标

loop

fetch

c_content

into content_re.empno,

content_re.ename,

content_re.job,

content_re.sal;

exit when

c_content%notfound;

utl_file.put(l_file, content_re.empno);

utl_file.put(l_file, content_re.ename);

utl_file.put(l_file, content_re.job);

utl_file.put_line(l_file, content_re.sal);

end loop;

close c_content;

UTL_FILE.FFLUSH (l_file);--确保缓存已经写入文件。

utl_file.fclose(l_file); --关闭句柄,一定不能忘!!!

end;

----------------------------------------------------------

附:utl_file包的介绍

utl_file包的应用是非常广泛的,而且也很实用,应为Oracle虽然有SQL*Loader可以将文本的内容读到数据库里, 但是不能将数据库内容输出到文本。所以基本上是要用到utl_file包来操作。先看了一下Oracle官方文档中的介绍, utl_file推荐直接使用自己创建的DIRECTORY来操作文件,而不要继续使用UTL_FILE_DIR包来指定。utl_file包的 工作机制是这样的:首先要使用FOPEN函数,将文件的路径、文件名、以及打开模式的参数传入,然后Oracle会到 ALL_DIRECTORIES视图中查看路径是否已经创建。如果路径和文件名均合法,则该文件被打开到一个file_type中, 然后可以进行各种操作,最后使用FCLOSE函数将其关闭。具体了解包可以查看utlfile.sql里面的内容,这里仅列举 一下常用过程和函数。

FOPEN

, IS_OPEN , GET_LINE , PUT , NEW_LINE ,

PUT_LINE , PUTF , FFLUSH , FCLOSE , FCLOSE_ALL 。

---------------------------------------------------------------

1.UTL_FILE.FOPEN

--FOPEN会打开指定文件并返回一个文件句柄用于操作文件。

FUNCTION UTL_FILE.FOPEN

( location IN VARCHAR2, --输出文件地址 filename IN VARCHAR2, --输出文件名 open_mode IN

VARCHAR2, --打开文件的模式 max_linesize IN BINARY_INTEGER DEFAULT NULL

--文件每行最大的字符数,包括换行符。最小为1,最大为32767

) RETURN

file_type; 3种文件打开模式:

R 只读模式。一般配合UTL_FILE的GET_LINE来读文件。

W 写(替换)模式。文件的所有行会被删除。PUT, PUT_LINE, NEW_LINE,

PUTF和FFLUSH都可使用。

A 写(附加)模式。原文件的所有行会被保留。在最末尾行附加新行。PUT, PUT_LINE, NEW_LINE,

PUTF和FFLUSH都可使用。

2.UTL_FILE.IS_OPEN

--如果文件句柄指定的文件已打开,返回TRUE,否则FALSE

FUNCTION UTL_FILE.IS_OPEN (file IN UTL_FILE.FILE_TYPE--文件句柄

)

RETURN BOOLEAN;

3.UTL_FILE.GET_LINE

--UTL_FILE只提供一个方法去读取数据:GET_LINE

读取指定文件的一行到提供的缓存。

PROCEDURE

UTL_FILE.GET_LINE(file IN UTL_FILE.FILE_TYPE, --文件句柄

buffer OUT VARCHAR2,--存放缓存,行终止符不会被传进buffer

len IN BINARY_INTEGER DEFAULT NULL);

4.UTL_FILE.PUT

--在当前行输出数据

--UTL_FILE.PUT输出数据时不会附加行终止符。

PROCEDURE UTL_FILE.PUT(file IN

UTL_FILE.FILE_TYPE, --文件句柄

buffer OUT VARCHAR2);--要写入的数据缓存

5.UTL_FILE.NEW_LINE

--在当前位置输出新行或行终止符,使用UTL_FILE.PUT必须使用NEW_LINE来结束当前行。

--但可以使用PUT_LINE输出带有行终止符的完整行数据。

PROCEDURE UTL_FILE.NEW_LINE(file IN UTL_FILE.FILE_TYPE,

--文件句柄

lines IN NATURAL := 1); --要插入的行数,默认为1行

6.UTL_FILE.PUT_LINE

--输出一个字符串以及一个与系统有关的行终止符。

--PUT_LINE相当于PUT后加上NEW_LINE;也相当于PUTF的格式串"%s/n"。

PROCEDURE UTL_FILE.PUT_LINE

(file IN UTL_FILE.FILE_TYPE,

--文件句柄

buffer IN VARCHAR2);--写入文件的数据缓存

7.UTL_FILE.PUTF

以一个模版样式输出至多5个字符串,类似C中的printf

PROCEDURE UTL_FILE.PUTF(file IN

FILE_TYPE,--文件句柄

format IN VARCHAR2,--格式串

arg1 IN VARCHAR2 DEFAULT

NULL,--可选参数,一共5个

arg2 IN VARCHAR2 DEFAULT NULL,

arg3 IN VARCHAR2 DEFAULT NULL,

arg4 IN

VARCHAR2 DEFAULT NULL,

arg5 IN

VARCHAR2 DEFAULT NULL);

格式串可使用以下样式

%s

在格式串中可以使用最多5个%s,与后面的5个参数一一对应

/n

换行符。在格式串中没有个数限制

%s会被后面的参数依次填充,如果没有足够的参数,%s会被忽视,不被写入文件

8.UTL_FILE.FFLUSH

--确保所有数据写入文件。

--操作系统可能会缓存数据来提高性能。因此可能调用put后,打开文件却看不到写入的数据。

--在关闭文件前要读取数据的话可以使用UTL_FILE.FFLUSH。

PROCEDURE UTL_FILE.FFLUSH (file IN UTL_FILE.FILE_TYPE);

9.UTL_FILE.FCLOSE

--关闭文件

PROCEDURE UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);

10.UTL_FILE.FCLOSE_ALL

--关闭所有已打开的文件

PROCEDURE UTL_FILE.FCLOSE_ALL;

在结束程序时要确保所有打开的文件已关闭,可使用FCLOSE_ALL。

oracle 导出数据 utl,【原创】利用utl_file包进行表数据导出相关推荐

  1. oracle读写文件--利用utl_file包对磁盘文件的读写操作

    oracle读写文件--利用utl_file包对磁盘文件的读写操作 摘要: 用户提出一个需求,即ORACLE中的一个表存储了照片信息,字段类型为BLOB,要求能导出成文件形式. 本想写个C#程序来做, ...

  2. 利用Flume将MySQL表数据准实时抽取到HDFS

    转自:http://blog.csdn.net/wzy0623/article/details/73650053 一.为什么要用到Flume 在以前搭建HAWQ数据仓库实验环境时,我使用Sqoop抽取 ...

  3. flume mysql hdfs_利用Flume将MySQL表数据准实时抽取到HDFS

    一.为什么要用到Flume 在以前搭建HAWQ数据仓库实验环境时,我使用Sqoop抽取从MySQL数据库增量抽取数据到HDFS,然后用HAWQ的外部表进行访问.这种方式只需要很少量的配置即可完成数据抽 ...

  4. 基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据

    基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据 文章信息 环境信息 系统概览 基于Python的UDP(服务端)数据接收 1. UDP接受的数据如何读取 文章信息 撰写日期 ...

  5. SQL Server 常用更新语句,用B表数据作为条件或数据源更新A表数据

    SQL Server 常用更新语句,用B表数据作为条件或数据源更新A表数据 示例:用B表姓名覆盖A表姓名 假设: A表数据 Id,Name 1,张三 B表数据 Id,Name 1,李四 用下面这个语句 ...

  6. oracle utl file putf,UTL_FILE包详解(第二篇)

    3.4 PUT() 英文解释:Writes astringtoafile 用法: utl_file.put(file IN FILE_TYPE, buffer IN); 函数原型: PROCEDURE ...

  7. Python利用pandas包快速导入和导出csv、excel文件数据

    导入excel数据: import pandas as pd # 导入数据 data = pd.read_excel(r"C:\Users\xw\Desktop\data4.xlsx&quo ...

  8. 利用UTL_FILE包实现文件I/O操作

    摘要:本文主要讨论如何利用Oracle的UTL_FILE包来实现对磁盘文件的I/O操作. 文件I/O对于数据库的开发来说显得很重要,比如如果数据库中的一部分数据来自于磁盘文件,那么就需要使用I/O接口 ...

  9. mysql utl_file_利用UTL_FILE包实现文件I/O操作

    摘要:本文主要讨论如何利用Oracle的UTL_FILE包来实现对磁盘文件的I/O操作. 文件I/O对于数据库的开发来说显得很重要,比如如果数据库中的一部分数据来自于磁盘文件,那么就需要使用I/O接口 ...

最新文章

  1. QEMU使用手册 - 1概述
  2. 已解决:虚拟机无法获取所有权
  3. 3ds max 渲染清晰面片的边缘
  4. SAP Spartacus 里的 cxOutletRef 指令执行过程分析
  5. 自定义控件的构建(12)
  6. Spring Setter依赖注入示例
  7. 多线程多进程解析:Python、os、sys、Queue、multiprocessing、threading
  8. iOS项目开发优秀文章汇总
  9. Tips--Docker常用命令
  10. Django REST framework 的快速入门教程
  11. ken沈oracle,甲骨文宣布推出Oracle商务软件
  12. android通用对话框,android-所有活动中的“通用”对话框
  13. Unity3D(四)Camera和SkyBox
  14. 协作中继认知无线电功率分配
  15. Java:Eclipse下载安装教程,以及Eclipse 安装汉化包的方法
  16. 余额宝不是吸血鬼,银行才是
  17. Grafana——》重置默认的登录密码
  18. 批量/去掉office 2010 Word中标题前的黑点
  19. 网络公益信息特征和用户行为规律研究以微博为例
  20. 新浪微博PC客户端(DotNet WinForm版)—— 初探

热门文章

  1. JVM方法区内存分配
  2. python分类算法报告_Python机器学习(1)——决策树分类算法
  3. 高并发之并发容器详解(从入门到超神)
  4. Jsoup抓取网页数据完成一个简易的Android新闻APP
  5. 数据结构-二叉树和二叉查找树
  6. (仿头条APP项目)5.列表页面设计实现
  7. 取代C语言标准输入输出:cin 和 cout【C++标准输入输出】
  8. Oracle Dababase_buffer_cache数据库高速缓存组织结构剖析
  9. Java消息中间件(activeMQ)
  10. css怎样通过超链接更改背景,css超链接的底色如何设置