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

SHORTNAME        CHAR(5)      Y                String - Users short name                                                                                       

IS_ACTIVE        CHAR(1)      Y                Character - Boolean                                                                                             

在sqlplus命令行中依次执行:

SQL> spool d:\spool_test.txt

Started spooling to d:\spool_test.txt

SQL> 

SQL> set echo off;

SQL> set feedback off;

SQL> set newpage none;

SQL> set linesize 1000;

SQL> set pagesize 0;

SQL> set term off;

SQL> set timing off;

SQL> set verify off;

SQL> select trim(USER_ID)||','||trim(FIRSTNAME)||','||trim(LASTNAME)||','||trim(IS_ACTIVE)

2  from test_user;

SQL> spool off;

Stopped spooling to d:\spool_test.txt

注意几个细节问题:

首先在SQL>命令提示符,使用spool命令,就可以启动/关闭文件写入磁盘动作。Spool on就是默认开启命令,而spool后加入路径就指定了文件目录名称。关闭写入spool off后,文件写入动作自动停止。注意:从文件大小角度看,只有在spool off的时候,通常系统才将结果从缓冲区写入到文件中。

其次是sqlplus参数配置。Sqlplus易用难精,有很多控制参数用于输出输入数据方式。对于一般使用者而言,可以直接保留一份固定的控制参数模板,对相同需求的命令可以直接使用。

生成文件之后,我们就可以在客户端机器的目录上找到对应文件。其中内容恰好是满足逗号分隔数据要求的。

111,222,222,Y

111,2222,33,Y

11,222,33,Y

(篇幅原因,有省略…..)

Spool方法的优点是很明显的,就是简单易用,对使用用户权限要求低,只要能够使用sqlplus工具,就可以生成文件。同时,生成文件在客户端,也不需要DBA和系统管理员设置目录权限管理空间消耗。

同时,spool方法的缺点也是比较明显的,就是生成文件大小限制。进入11g之后,sqlplus在缓冲区上有所扩大,但是依然还是很大的工作隐患。站在系统自动化的角度,生成的接口文件存放在客户端也不是一种规范的做法,不利于后续自动化传输处理。

总而言之,spool方法比较适用于小规模、简单数据文件的生成。

3、utl_file包使用

UTL_FILE是Oracle官方推荐的一种经典文件生成方法,主要原则是通过utl_file包来进行文本文件读写动作。与spool方法最大的区别,在于utl_file包主要是生成在数据库服务器端(也就是Oracle Instance运行的服务器上),同时utl_file包对于文件读写的控制更加细粒度化,以一种类似于C语言的方式进行文件读写。

从目前看,utl_file生成文件依然是从数据库端生成文件比较成熟的方案,特别是大接口文件。在一些高性能需求的场景下,还是有竞争力的。

对于utl_file包,不能不说到参数utl_file_dir。在Oracle 9.2之前,这个参数是生成读写utl_file执行的最重要参数。

SQL> show parameter utl_file

NAME                                TYPE        VALUE

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

utl_file_dir                        string     

在现在我们在网络查询资料时,还是能够看到对utl_file_dir参数的设置要求。在9.2之前的版本中,如果进行文件读写,都需要这个这个参数,将读写文件的所在目录添加到其上。否则Oracle就不能承认这个目录下的文件操作权限。略麻烦的是,这个参数修改要在spfile中进行,生效就需要重启服务器。

这种场景在9.2版本之后有了变化,directory对象的出现,提供了更好的读写目录管理和权限管理。最大的一个好处,就是在代码中,可以不用硬编码方式写目录结构。所以,当前utl_file_dir目录基本不会再使用,只是出于系统兼容性目的。

使用utl_file包方法使用如下步骤:

步骤1:创建directory目录

[oracle@sicslife /]$ su - root

Password: 

--确保操作系统层面的权限!

[root@sicslife ~]# cd /

[root@sicslife /]# chown -R oracle:oinstall /upload/

[root@sicslife /]# ls -l | grep upload

drwxr-xr-x.  4 oracle oinstall  4096 Aug  6 21:21 upload

SQL> create directory utl_path as '/upload';

SQL>

SQL> select directory_name, directory_path from dba_directories;

DIRECTORY_NAME                DIRECTORY_PATH

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

UTL_PATH                      /upload

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

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