我正在编写一段代码来对 XML 数据应用非常特定于客户的编码。起初我尝试只使用 PL-SQL 来执行此操作,但性能非常差(160 条记录需要 1 小时)。之后我只用 java 尝试了它,它提供了很好的性能(1 分钟内有 400.000 条记录)
现在我想看看当我用 Java 构建代码并将其加载到数据库中时性能如何。
为此,我有以下代码:
create or replace and compile java source named XmlNumericEncoder as
public class XmlNumericEncoder {
public static String encode(String xmlstring) {
String xmlstring_out = "";
for (int i = 0; i < xmlstring.length(); i++){
char ch = xmlstring.charAt(i);
if ((int)ch >= 192 && (int)ch <= 255){
xmlstring_out += "&#" + (int)ch + ";";
} else {
xmlstring_out += ch;
}
}
return xmlstring_out;
}
}
CREATE OR REPLACE FUNCTION XmlNumericEncoder(xmlstring varchar2)
RETURN String
AS LANGUAGE JAVA
NAME 'XmlNumericEncoder.encode(java.lang.String) return java.lang.String';
这段代码可以通过以下方式执行:
select XmlNumericEncoder('Böhmer') from dual;
我现在面临的问题是我需要该函数在存储在 clob 中的大部分数据上执行。我知道有一个 java.sql.Clob 类,我可以让它作为输入参数工作,但我似乎无法让它作为输出参数工作,我一直遇到空指针异常。
这是我正在使用的代码:
import java.sql.Clob;
import java.sql.SQLException;
public class XmlNumericEncoder {
public static Clob encode(Clob xmlclob) throws SQLException {
String xmlstring_out = "";
Clob xmlclob_out = null;
for (int i = 0; i < xmlclob.length(); i++){
char ch = xmlclob.getSubString(i,1).charAt(1);
if ((int)ch >= 192 && (int)ch <= 255){
xmlstring_out += "&#" + (int)ch + ";";
} else {
xmlstring_out += ch;
}
}
int setString = xmlclob_out.setString(0, xmlstring_out);
return xmlclob_out;
}
有什么想法我哪里出错了吗?