在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
相关文章
