1、在使用ORACLE的存储过程生成文件

在ORACLE中生成文件是比较方便的,尤其是生成对外接口的时候,通过定时任务完成,是一个非常直接的方法,而且比编译式语言具有更加灵活的方式。

使用PL/SQL生成文件时需要使用到两个东西:1.目录对象,2.文件工具包

1. 目录对象

目录对象是通过在数据库中建立一个对象,指向数据库所有机器的目录,注意不是本地目录。如果数据库在磁阵上,最好将文件放在磁阵上,这样做双机热备的时候不至于出现问题。

添加目录可以通过PL/SQL Developer或者其它可视化工具建立,也可以通过脚本来生成,脚本有如下形式:

-- Create directory
create or replace directory BAS_BLACK_DATAas '/data/appdata/metadata/dispatch/bas';

2. 文件工具包 UTL_FILE

通过UTL_FILE包可以完成文件读写,以下是我摘过来的一个UTF_FILE.fopen函数的文档。

这里注意一点,我这是10g版本下的,如果在9i下,不支持"wb", "rb“ ”ab"模式。

这意味着,不能使用二制式模式打开文件或者写文件,一般在写文件时,换行符就会与平台相关,如果在LINUX下需要生成回车换行符,就得手工操作:

UTF_FILE.put_line(line||chr(13)); -- 通过加下chr(13) = 0x0D方式加入一个回车符,如果在windows平台,会自动生成回车换行符。如果在WINDOWS上只想生成换行符,估计只能使用UTF_FILE.put方式手动写入换行符chr(10)。

详细参考可以通过在PL/SQL Developer上按Ctrl单击包,去查看包源码。

/*** FOPEN - open file**** As of 8.0.6, you can have a maximum of 50 files open simultaneously.**** As of 9.0.2, UTL_FILE allows file system access for directories** created as database objects.  See the CREATE DIRECTORY command.** Directory object names are case sensitive and must match exactly** the NAME string in ALL_DIRECTORIES.  The LOCATION parameter may be** either a directory string from the UTL_FILE_DIR init.ora parameter** or a directory object name.**** IN**   location     - directory location of file**   filename     - file name (including extention)**   open_mode    - open mode ('r', 'w', 'a' 'rb', 'wb', 'ab')**   max_linesize - maximum number of characters per line, including the**                  newline character, for this file.**                  Valid values are 1 through 32767 and NULL.  A NULL**                  value for max_linesize indicates that UTL_FILE should**                  calculate an operating system specific value at runtime.** RETURN**   file_type handle to open file** EXCEPTIONS**   invalid_path        - file location or name was invalid**   invalid_mode        - the open_mode string was invalid**   invalid_operation   - file could not be opened as requested**   invalid_maxlinesize - specified max_linesize is too large or too small**   access_denied       - access to the directory object is denied*/FUNCTION fopen(location     IN VARCHAR2,filename     IN VARCHAR2,open_mode    IN VARCHAR2,max_linesize IN BINARY_INTEGER DEFAULT NULL)RETURN file_type;PRAGMA RESTRICT_REFERENCES(fopen, WNDS, RNDS, TRUST);

2、生成文件时注意事项

生成文件时,如果是生成定长字节的文件时,需要注意与字符集相关的函数,如果使用错误,将会直接给接口文件带来问题,这可是我的教训啊!

举个例子:生成一行文本,要求限制在100个字节内。

如果我这么写

utf_file.put_line(rpad(content, 100));

上面这样子是不是就可以了呢?有没有问题?

大多数情况下没问题,但问题肯定有,如果查看rpad文件就会说明一点:

RPAD returns expr1, right-padded to lengthn characters with expr2, replicated as many times as necessary. This function is useful for formatting the output of a query.

The argument n is the total length of the return value as it is displayed on your terminal screen. In most character sets, this is also the number of characters in the return value. However, in some multibyte character sets, the display length of a character string can differ from the number of characters in the string.

这里的意思是说,该函数可以生成你指定的字符,而且这里的宽度一般是指在屏幕上显示的宽度,在多字符集下就会有问题。所有我们如果想处理这个问题,就需要寻求一个取得字节数的函数,并使用如下方式生成:

utf_file.put_line(content||rpad(' ', 100-lengthb(content)));

3、与文本相关函数比较

上面讲了,使用ORACLE生成文件时的注意事项,这里,再将相关的函数区别也列一下,只是需要特殊注意ORACLE中的NULL的处理问题,一般函数对于NULL返回NULL,所以如果生成文件的项为NULL就需要做特殊化处理,比如上面的输出定长100的行时,如果content为空,那该行也为空。所以正确的方式是判断字段的NULL否。

utf_file.put_line(decode(content, null, ' ', content)||rpad(' ', 100-lengthb(decode(content, null, ' ', content))));

1、length系列

The LENGTH functions return the length of char.LENGTH calculates length using characters as defined by the input character set.LENGTHB uses bytes instead of characters. LENGTHC uses Unicode complete characters.LENGTH2 uses UCS2 code points. LENGTH4 uses UCS4 code points.

如果想取得字节数,可以使用lengthb,如果使用UNICODE使用lengthc,如果使用UCS2使用length2,length4使用UCS4。

这里这么多字符集,其它只需要使用这些是相关标准,以及对应的字符宽度就可以了,而且这里的用语感觉也有点含糊。

相对于中文来讲,在GBK字符集情况下,length返回1,lengthb返回2,

在UTF8字符集情况下,length返回1, lengthb返回3,这是因为UTF8编码方式是这样子的,其它UTF8编码是UNICODE的一个编码方案而已。

2、vsize函数

VSIZE returns the number of bytes in the internal representation ofexpr.

以国际化呈现的方式返回字符串的字节数,这同样与字符集相关。

如下地址:http://space.itpub.net/16179598/viewspace-663045 对汉字在ORACLE中长度进行一些比较和实验,可以参考一下。

3、rpad函数

在前面已经说明了注意事项。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/yin138/archive/2011/08/18/4902259.html

使用ORACLE生成文本文件相关推荐

  1. oracle spool生成文件,用spool+unix shell生成文本文件

    比较熟悉使用ORACLE的人一般都会用spool命令来生成OS下的文本文件. 例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下: set pages 50000; se ...

  2. oracle bcp out,SQL Server利用bcp命令把SQL语句结果生成文本文件

    这篇文章主要为大家详细介绍了SQL Server利用bcp命令把SQL语句结果生成文本文件,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!在SQL ...

  3. oracle存储过程生成单号,Oracle生成单据编号存储过程的实例代码

    Oracle生成单据编号存储过程,在做订单类似的系统都可能会存在订单编号不重复,或是流水号按日,按年,按月进行重新编号. 可以参考以下存储过程 CREATE OR REPLACE procedure ...

  4. oracle索引自增函数,oracle生成动态前缀且自增号码的函数分享

    create or replace Function GetInvitationNO(prev varchar2, num1 varchar2, num2 varchar2, sessionSetti ...

  5. oracle存储过程插入自动编号,Oracle生成单据编号存储过程的实例代码

    Oracle生成单据编号存储过程,在做订单类似的系统都可能会存在订单编号不重复,或是流水号按日,按年,按月进行重新编号. 可以参考以下存储过程 0 then if DIsAutoCreate=1 TH ...

  6. oracle 随机数重复吗,Oracle生成不重复随机数

    项目中要依据车牌号码.日期和随机码生成运单号,所以写了函数和创建了历史码存储表来保证运单号的不重复. 运单号=车牌号码+日期+四位随机码 1.创建历史运单号存储表(用来比对新生成的随机号是否已被使用) ...

  7. Oracle生成日历表

    ORACLE生成日历表 Oracle生成日历表 代码 Oracle生成日历表 oracle日期转换 代码 CREATE OR REPLACE PROCEDURE SP_CREATE_TIME_DIME ...

  8. oracle怎样导入文件,oracle导入文本文件

    oracle导入文本文件 1.使用sqlldr 2.首先建立相应的表 create table test(ip1 number, ip2 number, locate varchar2(512),co ...

  9. Oracle 生成一张测试表并插入随机的个人基本信息数据

    Oracle 生成一张测试表并插入随机的个人基本信息数据 表名(HIBOX_User_Bigdata) 字段信息 姓名 性别 民族 员工籍贯 员工工号(8位) 员工政治面貌 0=群众,1=少先队员,2 ...

最新文章

  1. 20行Python代码把自己塑造成一位素描大师
  2. Go to sleep
  3. NOI2006 最大获利
  4. oracle 052考试,Oracle OCP认证考试题库解析052-5
  5. rocketmq 顺序消费_10 分钟看懂消息队列 RocketMQ
  6. 【华为云技术分享】一行代码就能写一个日志打印组件,你信吗?为你揭晓LiteOS中日志打印组件的核心
  7. 计算机图形学E3——OpenGL 中点画圆
  8. java bean参数清空_Java互联网架构-Spring IOC底层源码分析
  9. 安卓音量阶数修改_16款手机UI随便用,音量调节原来可以这样玩
  10. express学习 - (1)环境配置与第一个express项目
  11. 【单目标优化求解】基于matlab秃鹰算法(BES)求解最优目标问题【含Matlab源码 1546期】
  12. PHP之 直播开发后端需要做什么——准备工作
  13. nodeJS笔记参考菜鸟教程
  14. java论坛 基于SSM框架的游戏论坛 java游戏贴吧 java游戏论坛 java论坛 ssm论坛 ssm贴吧 可以改为各种论坛,分类可在后台自己控制,图片可任意换
  15. 焊接大师给您支招——10种焊接堵漏方法供你选
  16. [推荐系统]协同过滤介绍
  17. 计算机操作培训图片,【图片】计算机学习之旅【汇编吧】_百度贴吧
  18. C#根据百家姓,将姓转拼音处理
  19. Python爬虫学习笔记_DAY_3_Python类型查询与类型转换【Python爬虫】
  20. [OAuth2.0三方登录系列文章-1]OAuth2.0与三方登录的端到端方案

热门文章

  1. 使用 Flex 布局与其他普通布局的简单对比
  2. Shell脚本(学习笔记1)
  3. 《算法设计》二、算法分析基础
  4. nginx+tomcat的负载均衡
  5. ***帮兄设计实战分析
  6. Exchange Server 2019新功能预览-揭秘被削减的功能
  7. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
  8. 自动化运维工具Ansible详细部署
  9. 云计算:革新动力并不是一把万能钥匙
  10. MySQL有关Group By的优化