
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
C++ Builderで文字列をバイトに...
-
SQLで1バイト、2バイト混在...
-
Excel VBA で Oracle CLOB型カ...
-
エクセルシート名の制限を変更...
-
pythonでバイナリデータを配列...
-
3バイト文字(UTF-8)をprintfで...
-
COBOLのCOMP形式について
-
機種依存文字をチェックしたい。
-
全角半角を調べるライブラリ関...
-
テキストBOXの入力制限について
-
URLは最高何文字まで可能なので...
-
この関数はどのプログラミング...
-
VBAでUnicodeしか存在しない文...
-
1KBが1024byteな理由
-
「1TB」のHDDに日本語は何字入...
-
VB6でのファイルサイズ取得につ...
-
100MB
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
バイト列とバイナリ列の違いが...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
ピクセル,dpiから容量(バイト...
-
GetWindowTextでアドレスバーか...
-
この関数はどのプログラミング...
-
ソケット通信の受信サイズ
-
:(コロン)のKeyCode
-
COBOL PICTUREで X,S,Vの意味
-
memcmp バイナリデータの比較方法
-
より高速な画像の表示法
-
半角、全角の判別方法
-
最大長を用意せずにバイナリデ...
-
64bit対応
-
バイナリとBCDコード
おすすめ情報