プロが教える店舗&オフィスのセキュリティ対策術

Excel VBA を使用して、Oracleに格納されている文字列を取得しようとしています。

Number型やVarchar2型のカラムからは問題なく取得できるようになったのですが、CLOB型で文字列を格納しているカラムからの取得でつまずいています。

自分の書いた方法だと、1600バイト以上の文字列が格納されているとエラー文字が返ってきてしまいます。

これ以上の文字数を取得する方法について教えてもらえないでしょうか?


'---// コード抜粋 ココから //---

'ORAセッション生成
Set OraSession = CreateObject("OracleInProcServer.XOraSession")

'ORADB生成
Set OraDatabase = OraSession.OpenDatabase(<<dbname>>, <<id>> & "/" & <<passwd>>, 0)

Dim SQL As String '一覧取得用SQL
Dim RS As Object 'レコードセット

SQL = " SELECT <<<clob_col_name>> FROM <<table_name>> "

Set RS = OraDatabase.DbCreateDynaset(SQL, 0&)

Range("A1").Value = RS.fields("<<clob_col_name>>").GetChunk(0, 3263)

RS.Close

'---// コード抜粋 ココまで //---


環境は、Excel 2003、Oracle 9iです。
ひとつよろしくお願いいたします。

A 回答 (1件)

>1600バイト以上の文字列が格納されていると



本当に1600バイトジャストで起こりますか?

GetChunk(0, 3263)
で、チャンクサイズを3263バイト取ってあるのがまずいような気がします。

http://www.shift-the-oracle.com/element/data-typ …
を見ると分かるように、CLOB型の内部データ型は2バイト固定文字列ですので
この指定方法だと3263が奇数なので、2バイト文字を途中で割ってしまいまい、取り出せないのではないでしょうか。
従って3262バイト(=1631文字)までは大丈夫で、それ以上の文字列が格納されている場合は最後にゴミがついてくるため怒られると思います。

GetChunkメソッド
http://otndnld.oracle.co.jp/document/products/or …

※第2引数は文字数ではなくバイト数です
    • good
    • 0
この回答へのお礼

piyo2000 様の回答を基に修正することで動作しました!
ありがとうございます!

>本当に1600バイトジャストで起こりますか?
大まかな確認しかしておりませんでした…。
改めて確認してみたところ、(後述頂いたご指摘通り)1632文字が境界値でした。

>CLOB型の内部データ型は2バイト固定文字列です
完全に誤認していました…。
更に、今回、対象カラムに格納する文字列が半角英数だけだったため、勝手に「文字数=バイト数」と思い込んでいました。

>※第2引数は文字数ではなくバイト数です
上記の思い込みもあって未確認でした…。

今回、対象カラムに格納する最大桁数が「3264文字」なのですが、substr的な使い方と混同して、「GetChunk(0, 3263)」と書いておりました。
これを「1文字=2バイト」と換算して、以下のようにする事で問題なく文字列を取得できるようになりました。

>GetChunk(0, 6528)

ご丁寧に、ご指摘・ご教示頂きまして大変助かりました…。
本当にありがとうございました!
リンク先もとても勉強になりました。
今後も参考にさせて頂きたいと思います。

お礼日時:2008/07/16 08:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!