技术开发 频道

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



    第2天工作之余继续思考该问题,不知过了多久,也不知是苦尽甘来,还是百无聊赖之际,突然想起:ORACLE不是到处大肆宣扬,从ORACLE8I开始(客户的数据库环境817),Oracle Java虚拟机是全面兼容Java运行环境。也就是说,JAVA程序可以放到ORACLE数据库里运行。嗯,能否这样:用JAVA编写个程序,用于删除指定文件最后的回车换行符,装载到数据库中,在数据输出完后调用该程序来允许即可。想到这里,我喜出望外,立即把想法和写JAVA的同事说明,同事表示这操作很简单。和小组成员解释,他们也表示可以尝试一下。喜庆之余,立即开始着手处理技术问题:

    首先遇上的问题是,如何判断ORACLE数据库里安装了JVM(由于删除字符操作很简单,我想没必要询问需要安装第几版本才能支持此操作)?其次,如何装载和卸载JAVA程序?很快,从ORACLE的官方文档上找到这两个问题的帮助信息,测试一下,没问题; 再就是,如何创建存储过程,使之和指定的JAVA程序关联起来,即调用该存储过程来运行JAVA程序。在ITPUB上询问,果然,有热心人士指点,和另外一位同事一起,经过几番测试,思考,询问,再测试,也获成功;紧接着是要操作的文件路径的问题。大家知道,ORACLE在操作系统的文件时,需要事先设置参数UTL_FILE_DIR为要操作的文件路径,才能操作该目录下的文件,不知道JAVA在读写文件时,是不是也得这样设置?再次询问,也得到了热心人士的帮助。

    用JAVA程序删除字符的要求很简单,同事早已写好程序并且在WINDOWS 环境下测试成功,只待我解决上述的技术问题。忙碌了一个下午后,在逐步实现ORACLE里调用JAVA的过程中,也逐步解决了实现该应用需要准备的技术细节问题。万事具备后,把程序LOAD进数据库后,运行发现报错:

//一段代码样例 import java.io.*; public class DeleteCRLF { public DeleteCRLF() { } public static void delete(String fileName) throws java.io.IOException{ String errMsg = ""; try { File f = new File(fileName); if (!f.exists()) throw new java.io.IOException("File not found!"); if (!f.canRead()) throw new java.io.IOException("File can not be read!"); if (!f.canWrite()) throw new java.io.IOException("File can not be write!"); RandomAccessFile raf = new RandomAccessFile(f, "rw"); if (raf.length() >= 2) { //throw new java.IOException("File greater than 2."); raf.seek(raf.length() - 2); byte b1 = raf.readByte(); byte b2 = raf.readByte(); //short s = raf.readShort(); //if (s == 0x0D0A) // raf.setLength(raf.length() - 2); if (b1 == 0x0D && b2 == 0x0A) { raf.setLength(raf.length() - 2); throw new java.io.IOException("The last byte is: " + b1 + ", " + b2); } throw new java.io.IOException("The last two byte is: " + b1 + ", " + b2); } raf.close(); } catch (SecurityException se) { throw new IOException("Security violation for access the file!"); } catch (IOException ie) { throw new IOException(ie.getMessage()); } catch (Exception e) { throw new IOException(e.getMessage()); } } } ==程序编译正常,如: D:\Oracle\Ora81\Apache\jdk\bin>javac d:\tool\DeleteCRLF.java 执行正常 ==已经删除掉文件末端的两个字符 D:\Oracle\Ora81\Apache\jdk\bin>java -cp d:\tool DeleteCRLF The last byte is: 13, 10 D:\Oracle\Ora81\Apache\jdk\bin> ==LOAD入数据库正常 D:\Oracle\Ora81\bin>loadjava -user scott/tiger d:\tool\DeleteCRLF.class D:\Oracle\Ora81\bin> SQL> begin 2 DeleteCRLF('D://TEMP//AE_TXT.TXT'); 3 end; 4 / begin ERROR at line 1: ORA-29532: Java call terminated by uncaught Java exception: java.io.IOException: The last byte is: 13, 10 ORA-06512: at "SCOTT.DELETECRLF", line 0 ORA-06512: at line 2 }
0
相关文章