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です。
ひとつよろしくお願いいたします。
No.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引数は文字数ではなくバイト数です
piyo2000 様の回答を基に修正することで動作しました!
ありがとうございます!
>本当に1600バイトジャストで起こりますか?
大まかな確認しかしておりませんでした…。
改めて確認してみたところ、(後述頂いたご指摘通り)1632文字が境界値でした。
>CLOB型の内部データ型は2バイト固定文字列です
完全に誤認していました…。
更に、今回、対象カラムに格納する文字列が半角英数だけだったため、勝手に「文字数=バイト数」と思い込んでいました。
>※第2引数は文字数ではなくバイト数です
上記の思い込みもあって未確認でした…。
今回、対象カラムに格納する最大桁数が「3264文字」なのですが、substr的な使い方と混同して、「GetChunk(0, 3263)」と書いておりました。
これを「1文字=2バイト」と換算して、以下のようにする事で問題なく文字列を取得できるようになりました。
>GetChunk(0, 6528)
ご丁寧に、ご指摘・ご教示頂きまして大変助かりました…。
本当にありがとうございました!
リンク先もとても勉強になりました。
今後も参考にさせて頂きたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
最近、いつ泣きましたか?
泣いてストレス発散! なんて言いますよね。 あなたは最近いつ、どんなシチュエーションで泣きましたか?
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
CLOBデータの取得方法
Visual Basic(VBA)
-
Oracleでの文字列連結サイズの上限
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
【VB2005】テキストボックス内...
-
バイト列とバイナリ列の違いが...
-
char str[256]の256の意味は?
-
Javaで日本語1文字のバイト数
-
日本語で関数名等を記述するの...
-
1KBが1024byteな理由
-
ピクセル,dpiから容量(バイト...
-
UCS-2の一覧表が欲しい
-
GetWindowTextでアドレスバーか...
-
質問です。
-
「1TB」のHDDに日本語は何字入...
-
pythonでバイナリデータを配列...
-
URLは最高何文字まで可能なので...
-
0.5バイトづつ読み込みたいので...
-
「C#」言語のトレースについて…...
-
バイト数って何??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
char str[256]の256の意味は?
-
COBOLのCOMP形式について
-
バイト列とバイナリ列の違いが...
-
「1TB」のHDDに日本語は何字入...
-
ピクセル,dpiから容量(バイト...
-
ビットスワップとバイトスワッ...
-
VBAでShift-JISのURLエンコード
-
Javaで日本語1文字のバイト数
-
機種依存文字をチェックしたい。
-
【VB2005】テキストボックス内...
-
3バイト文字(UTF-8)をprintfで...
-
:(コロン)のKeyCode
-
UCS-2の一覧表が欲しい
-
memcmp バイナリデータの比較方法
-
VB.NET LeftBの代用
-
URLは最高何文字まで可能なので...
-
VBSでテキストファイルの文字列...
おすすめ情報