浅说两种输出Oracle字符文件的方法

归纳几条简单方便的经验之谈吧。前几天,一个同事为做项目和笔者讨论将数据库检索处理结果输出的方法。为了简单明了,笔者按照不同的需求场景准备了两种策略供同事进行选择,记录下来,权作不时之需的留存。

文本文件输出,特别是大数据量文本文件输出,是我们在实际需求领域中经常遇到的场景。文本文件是我们最早接触的文件格式,格式单一,内容简单。但是,也正是因为结构简单,是很多“中间结构文件”通常选择的载体。从最早简单的txt、csv,到现在越来越多出现xml,本质上都是以文本格式文件进行保存。

所谓“中间结构文件”,也就是我们通常所说的接口文件。如果系统之间需要进行大规模数据传输、接入或者交互,双方共同认可的“协议”也就是问题的关键。通过接口文件格式外加自动化上传、定位和检索机制,是可以实现解耦方式的系统间数据交互。

Oracle环境中通常使用的文本生成方式传统上有两种,一种是借助原生的sqlplus命令行工具,将数据转出到客户端目录上。注意:sqlplus命令行系列默认输出是屏幕。另一种是借助utl_file工具包将数据输出到数据库服务端(Server Side)。两种方法各有利弊优缺点,各有适应的场景。下面分别进行讨论。

1、实验环境介绍

笔者使用Oracle 11gR2版本进行测试,具体版本为11.2.0.4。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0      Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

2、Sqlplus的Spool方法

Spool方法是脚本工程师比较常用的策略。思路其实也比较简单:在传统的编程结构中,数据处理结果的输出是有一个导向定位机制的。默认情况下,Sqlplus系工具的输出是屏幕窗口。Spool方法就是重新设置输出方式,将结果文本内容输出到磁盘文件中。

使用spool文件有两个方面需要关注:首先是文件位置。生成的文件,无论是Linux/AIX文件还是Windows系列,都是在客户端所在的计算机(执行程序的机器)上生成。另一个就是文本量限制,无论是使用sqlplus、还是PL/SQL Developer的Command Windows窗口,都会遇到潜在的缓冲区buffer溢出风险。这也就限制了生成文件的大小。

下面我们通过一个简单实验来进行证明,实验数据表结构如下:

SQL> desc test_user;

Name            Type        Nullable Default Comments                                                                                                         

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

OBJECT_ID        CHAR(32)                      String - Object Id                                                                                               

USER_ID          CHAR(32)    Y                String - Unique User ID                                                                                         

FIRSTNAME        CHAR(50)    Y                String - Users first name                                                                                       

LASTNAME        CHAR(50)    Y                String - Users last name                                                                                         

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/be122e29951eef3fd147fa155487fff6.html