- - PR -
StringをCLOB型の情報として戻したい
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-09-01 16:06
SOAPサーバより取得したString型の情報を取り扱うOracleのJavaストアド・プロシージャを作成しています。
取得した値は最終的にはPL/SQLで取り扱うことになり、2000バイト以上になる可能性があるため、Javaプログラムの方でString(VARCHAR2:2000バイトまでの取扱い)からClobに型を変えてreturnさせたいと思っています。 あちこち検索してみたのですが、DBに登録されている情報をCLOBに書き込む例は見つかるのですが、私のしたいことの例を見つけれませんでした。 まず「できる」「できない」の判断からしたいと思っています。 どなたか智恵を貸していただけませんか?宜しくお願い致します。 | ||||
|
投稿日時: 2004-09-01 23:54
Clob型というのはjava.sql.Clobのことですか?
java.sql.Clobであれば、setString(long pos, String str)というメソッドがありますが、利用できないのでしょうか? | ||||
|
投稿日時: 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-09-02 13:23
だそうです。 そもそも、StringをClobにしたいのは何故でしょうか? [ メッセージ編集済み 編集者: ちょま吉 編集日時 2004-09-02 13:24 ] | ||||
|
投稿日時: 2004-09-02 13:24
2重投稿により削除しました。[ メッセージ編集済み 編集者: ちょま吉 編集日時 2004-09-02 13:28 ] | ||||
|
投稿日時: 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); } ----------------------------------------------------------- | ||||
|
投稿日時: 2004-09-02 14:28
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) | ||||
|
投稿日時: 2004-09-02 15:01
もう別の話題に移っている気もしますが・・・
m_clobはnullのままなので、当然java.lang.NullPointerException 発生しますよね・・・ | ||||
