非常に顧客固有のエンコーディングを 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 クラスがあることはわかっており、それを入力パラメーターとして機能させることはできますが、出力パラメーターとして機能させることができないようです。nullpointer 例外が発生し続けます。
これは私が使用していたコードです:
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;
}
私が間違っているアイデアはありますか?