技术开发 频道

在ORACLE里调用JAVA程序解决 utl_file 错误



    【IT168 专稿】本文描述在一次工作中,遇上输出文本时,需要去掉UTL_FILE包输出时带回车换行符的问题。在经过多次思考努力后,最后找到在ORACLE里调用JAVA来替代UTL_FILE包输出数据的方法。完满地解决多出的回车换行符问题的过程。

    那是几年前的事了,当时我新进一家新成立的港资公司工作,公司的主营业务是面向香港,承接外包服务。

    刚进公司不久,领导就交给我们(几个搞ORACLE的)一任务:从一接口库获取数据,按业务要求对数据进行筛选过滤后,生成文本输出到指定的目录。 分析清楚用户需求后,感觉很简单,没花多少工夫,便把程序写好,输出时使用了ORACLE自带的UTL_FILE包; 按流程,让另外几位同事作了测试后连源码一起提交给客户。 但没过一个礼拜,客户便反馈,程序没问题,但输出/生成的文本的最后一行自动带了回车符,文件的结尾不是最后一个字符,而是新起一空行,他们不接受这样的结果,要求我们删除最后一个换行符,一个礼拜后交货。  接到反馈后,我便和几个同事研究,除了反复测试输出过程UTL_FILE. PUT_LINE外,还测试了NEW_LINE和PUT 过程,但结果都PUT_LINE一样,无法避免回车符。于是上网寻求解决方法,当时网络上关于ORACLE的技术论坛还不是很热,同事在ORACLE的TOM论坛查到类似的需求,结果,我记得TOM当时的答复是:ORACLE承认那是一个BUG,但还没修复。当时我是公司ORCLE技术的主力,解决问题的重任落在我身上。既然在网上找不到解决方法,唯有自己思考:

    回忆起2000年初研究ORACLE8新特性时,我发现该版本有一新功能,叫外部过程,即,可在ORACLE里调用操作系统层的共享库。大概流程是,监听器里配置调用外部动态库的监听配置,在数据库里定义好和外部共享库接口的存储过程,当运行存储过程时,其将驱动监听分裂出(EXPORTC)进程去调用该共享库。看到该功能后,我尝试在WINDOWS环境测试该功能:请了同事帮忙用VC写了个共享库(动态链接库),然后在库里测试调用,经过几轮调试,果然可以按照指定的目录,文件名,生成输出文件内容:HELLO WORLD!这是我当时首先考虑到的可采用的技术。当时想着:文件输出结束后,紧接着调用动态库来复制该文件的内容,末尾截掉文件的回车换行符,生成新的文件,应该可行。但再思考时,感觉方法不是很爽,好像心口有东西被堵,具体又说不出来哪不对劲,于是放下这想法,先忙别的,让这思想酝酿酝酿。

    下午忙完了,又思考回这个问题,过了一会想明白了,是复制过程太浪费,没必要;而且初始文件在命名时可能会遇上如何保证唯一文件名的问题。想想,何必复制,若能用程序把最后那个回车符给删除调,不更快捷!随即问了旁边写C的同事,能否删除指定文本的最后的回车符?他问清楚我的想法后想了想,肯定答复。

    至此,我想,技术问题已经解决,正要整理思路和小组成员讲解,看看他们的意见。突然想起,客户说过,他们使用的是HP服务器,而我们没有此测试环境,无法编写测试;紧接着又发现我遗漏了一个重点:客户是香港公司,我们无法远程连接给客户的数据库服务器配置监听器,也不太可能为了采用这个方法,跑到客户公司去配置监听器,何况,他们不一定允许我们操作。想到这里,明白刚产生的思路不切可行。
0
相关文章