0

非常に顧客固有のエンコーディングを 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;
    } 

私が間違っているアイデアはありますか?

4

5 に答える 5

0

NullpointerException は行によるものです

Clob xmlclob_out = null;

この場合、Clob を初期化する方法がよくわかりません。接続を使用するチュートリアルでは、次のようなことを行います

Clob myClob = this.con.createClob();
于 2013-09-30T14:34:31.227 に答える
0

わかりました、試してみましたが、Java コードが実際に Oracle データベースに格納されている場合は、そうではないようです。コードを次のように変更しました。

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED MAGMA."XMLNUMERICENCODER" AS
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class XmlNumericEncoder {

public static Clob encode(Clob xmlstring) throws SQLException { 

    Connection conn = DriverManager.getConnection("jdbc:default:connection:");

    String xmlstring_out = "";
    Clob xmlclob_out = conn.createClob();
    for (int i = 0; i < xmlstring.length(); i++){
        char ch = xmlstring.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;
} 

}

しかし、コンパイルしようとすると、次のエラーが発生します。

XMLNUMERICENCODER:12: シンボルが見つかりません

シンボル : メソッド createClob()

場所: インターフェース java.sql.Connection

クロブ xmlclob_out = conn.createClob();

また、次のような接続を作成しようとしました: Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@//localhost:1521/dbname", "username", "password")

しかし、それは私に同じエラーを与えました。

私はすでにデータベースにいるので、接続を作成する必要があるのは少し奇妙に思えます。

于 2013-10-03T06:59:06.693 に答える
0

まず、JDBC 接続を取得する必要があります。Java ストアド プロシージャ内からは、次のように実行する必要があります。

Connection conn = DriverManager.getConnection("jdbc:default:connection:");

createClob()のメソッドを使用してjava.sql.Connection、オブジェクトをインスタンス化して CLOB を表すことができます。

Clob の API ドキュメントを参照してください。

于 2013-09-30T15:02:31.413 に答える