- PR -

StringをCLOB型の情報として戻したい

投稿者投稿内容
ねこのこ
会議室デビュー日: 2004/09/01
投稿数: 6
投稿日時: 2004-09-01 16:06
SOAPサーバより取得したString型の情報を取り扱うOracleのJavaストアド・プロシージャを作成しています。
取得した値は最終的にはPL/SQLで取り扱うことになり、2000バイト以上になる可能性があるため、Javaプログラムの方でString(VARCHAR2:2000バイトまでの取扱い)からClobに型を変えてreturnさせたいと思っています。
あちこち検索してみたのですが、DBに登録されている情報をCLOBに書き込む例は見つかるのですが、私のしたいことの例を見つけれませんでした。

まず「できる」「できない」の判断からしたいと思っています。

どなたか智恵を貸していただけませんか?宜しくお願い致します。
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2004-09-01 23:54
Clob型というのはjava.sql.Clobのことですか?
java.sql.Clobであれば、setString(long pos, String str)というメソッドがありますが、利用できないのでしょうか?
ねこのこ
会議室デビュー日: 2004/09/01
投稿数: 6
投稿日時: 2004-09-02 09:58
ちょま吉さん、書き込みありがとうございます。

-----------------------------------------
import java.sql.*;

public class testClob {

public static void main() {

java.sql.Clob m_clob = null;
String m_string = "01234567890";
try {
m_clob.setString(0L,m_string); <-----ココ
} catch (java.sql.SQLException se) {
System.out.println(se);
} catch (Exception e) {
System.out.println(e);
}
}
}
-----------------------------------------

というようなコードを書いて実行してみたのですが、
”ココ”の行でExceptionに飛んでしまい、
java.lang.NullPointerException
が出力されてしましました。


何かClobに対する処理が不足しているのでしょうか・・・?
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2004-09-02 13:23
引用:

Clob オブジェクトはデータそのものではなく SQL の CLOB データへの論理ポインタを格納します。Clob オブジェクトは、それが生成されたトランザクションの期間中に有効です。



だそうです。
そもそも、StringをClobにしたいのは何故でしょうか?


[ メッセージ編集済み 編集者: ちょま吉 編集日時 2004-09-02 13:24 ]
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2004-09-02 13:24
2重投稿により削除しました。

[ メッセージ編集済み 編集者: ちょま吉 編集日時 2004-09-02 13:28 ]
ねこのこ
会議室デビュー日: 2004/09/01
投稿数: 6
投稿日時: 2004-09-02 14:10
対象システム自体はPL/SQLを駆使して作成されており、
SOAPサーバとの通信部分のみJavaで作成してます。

で、Javaの世界ではString型で問題ないのですが、
PL/SQLの世界に通信メッセージを持ちこむ際、
対象データが2000Byte(OracleのVarchar2=Stringに対応するデータ型の最長)を超過する可能性があるため、CLOBに目をつけました。

でも、ちょま吉さんが調べてくださった引用の文章をみると、
トランザクション期間中しかClobは使用できないようですね・・・。

Stringの配列として戻すパターンで処理を考えてみます。

ありがとうございました。

あと蛇足ですが、
CLOBを列に持つテーブルを作成し、
java.sql.Clobではなくoracle.sql.CLOBを用いて
以下のようなコードでStringの情報がCLOBに
登録されることは確認できました。
-----------------------------------------------------------
try {
Writer m_writer;
String m_string = "0123456789";

DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection("host_name:port#:sid","userID","pswd");
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("SELECT x, c FROM MY_CLOB WHERE X='row1' FOR UPDATE");
rset.next();
CLOB m_clob = ((OracleResultSet)rset).getCLOB(2);
m_writer = m_clob.getCharacterOutputStream();
m_writer.write(m_string);
m_writer.flush();
m_writer.close();

//ここからは書き込んだデータのチェック用
Reader m_reader;
char [] char_array = new char[10];
ResultSet rset2 = stmt.executeQuery("SELECT * FROM XXV_AS_CLOB WHERE X= 'row1'");
rset2.next();
CLOB m_clob2 = ((OracleResultSet)rset2).getCLOB(2);
m_reader = m_clob2.getCharacterStream(0L);
int char_read = m_reader.read(char_array,0,10);
m_reader.close();
for (int i = 0; i < 10; i++){
System.out.println("["+i+"]" + char_array[i]);
}
} catch (SQLException se) {
System.out.println(se);
} catch (IOException ie) {
System.out.println(ie);
} catch (Exception e) {
System.out.println(e);
}
-----------------------------------------------------------
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2004-09-02 14:28
引用:

ねこのこさんの書き込み (2004-09-02 14:10) より:
対象システム自体はPL/SQLを駆使して作成されており、
SOAPサーバとの通信部分のみJavaで作成してます。

で、Javaの世界ではString型で問題ないのですが、
PL/SQLの世界に通信メッセージを持ちこむ際、
対象データが2000Byte(OracleのVarchar2=Stringに対応するデータ型の最長)を超過する可能性があるため、CLOBに目をつけました。



java.sql.CallableStatement#setCharacterStream()を使えばいいのではないでしょうか?
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/sql/CallableStatement.html#setCharacterStream(java.lang.String, java.io.Reader, int)
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2004-09-02 15:01
もう別の話題に移っている気もしますが・・・

引用:

ねこのこさんの書き込み (2004-09-02 09:58) より:

java.sql.Clob m_clob = null;




m_clobはnullのままなので、当然java.lang.NullPointerException 発生しますよね・・・

スキルアップ/キャリアアップ(JOB@IT)