入力データツールでOracle DBからBLOB型のデータを抽出しようとすると以下のエラーとなります。
Start: Designer x64: Started running at 06/14/2021 17:25:30
Info: Input Data (1): Alias translated to oci:AALXSREF01/__EncPwd1__@131.220.12.42:5001/MIM001.world|||select ADIPC001SADM01.TBL_TRN_CONT.PUB_ID, ADIPC001SADM01.TBL_TRN_CONT.CONTENT, ADIPC001SADM01.TBL_TRN_CONT.CONTENT_SEQ, ADIPC001SADM01.TBL_TRN_CONT.LAST_UPDATE_TIMESTAMP, ADIPC001SADM01.TBL_TRN_CONT.LAST_UPDATE_USER from ADIPC001SADM01.TBL_TRN_CONT
Error: Input Data (1): m_OCILobRead Error: OCI_NEED_DATA
End: Designer x64: Finished running in 3.4 seconds with 1 error
"CONTENT"というフィールドがBLOB型です。これをSELECT文から外すと正常に処理されます。
抽出結果は「3レコード」ですが、どうも改行コードが乱れていて数万行が1レコードに入ってしまっているようです。
"OCI_NEED_DATA"で検索すると、OracleのヘルプにOCILobRead関数につき以下の記述がありますが、よくわかりません;
コールバック関数が定義されていない場合は、OCI_NEED_DATAエラー・コードが戻ります。アプリケーションでは、OCI_NEED_DATAエラー・コードが戻らなくなるまで何度もOCILobRead()をコールし、LOBのピースを読み取る必要があります。ピースのサイズを変えながら複数の場所を読み取る場合は、コールごとにバッファ・ポインタと長さを変えることができます。
Community上に上記と全く同じエラーは見つかりませんでしたが、
Issue with OCI connection - Force SQL_WChar Support not working for LOB
Unable to read Oracle data - ORA-22835
などを見ると、AlteryxよりはDBMS側の課題のようにも思えますが
Oracle方面は(も?)不案内のため、仮にDB担当者と話すとしても、どのように話を持っていくか悩んでおります。
調査や解決に向けたアプローチなどアドバイス頂けると幸いです。
BLOBと記載ありますがCLOBでしょうか?(BLOBはバイナリですが、記載を見るとテキストのようにお見受けしました)
まぁ、それが特に何かあるわけではないのですが、試すとしたら以下でしょうか。
1.接続用ドライバにOCIを使っていらっしゃるようなのでODBCやOleDBに変更してみる
2.InDBで一度接続し、データストリーム出力でAlteryxの方に持ってくる
取り急ぎ思いつくのはこのあたりでしょうか・・・。
いつも迅速な回答ありがとうございます。
BLOBかCLOBか
DBの担当者に聞いたところ、テキストを暗号化したファイルをBLOBで格納しているそうです。
Oracleの透過的データ暗号化(TDE)とかいう機能で復号されて渡されている様です。
また、1ファイルはかなり大きなものであり、BLOBをTEXTに変換した中に「数万件のレコード」が入っていること自体は問題ではなさそうです。
1.接続用ドライバ
DB Connectionを設定した担当から「ODBCです」と言われて
winx64_12102_client.zip ("Oracle Database Client (12.1.0.2.0) for Microsoft Windows (x64)")
を使って"Instant Client"というクライアントをインストールしましたので、ODBCを使っていると理解しています。
「OCI~」のメッセージが出る理由はよくわかりませんが、ODBCの内部でOCIが呼ばれているのでしょうか。
2.InDBで接続
InDBツールは使ったことがないので、試してみます。
InDB接続を調べたところ、以下のようにピンポイントでお断りされてしまいました orz
https://help.alteryx.com/ja/current/designer/oracle
サポートされないデータ型
次のデータ型はサポートされていないため、[ストアドプロシージャ] パラメータ値フィールドに入力できません。
・バイナリタイプ: raw、ロングプレーン、および BLOB
ストアドプロシージャにサポートされないデータ型が含まれている場合は、次の操作を行います。
・デザイナーは、データ型を [サポート外] に設定します。
・データ グリッドの値列は読み取り専用になり、[OK] ボタンは無効になり、ストアド プロシージャを実行できないことを示します
(CLOBならよかったのかな。。。)
キーを指定して、1行だけ持ってくるとうまくいく場合もあります。
この辺から違い目を探ってみようかと考えております。
元々ご紹介頂いたURLで、「Force SQL_WChar Support」オプションにチェックを入れるというのがありますが、こちらは試されてますでしょうか?
ワイド文字を強制的にサポートする、みたいなオプションみたいですが・・・。一部のUnicode文字で引っかかる場合はこのオプションが有効という風に読み取れます。
うまくいく場合というのがあるようですので、そういう特定の文字でひっかかっている可能性もあるかな、と思いました。
アドバイスありがとうございます。
「Force SQL_WChar Support」オプションをオンにしてみましたが、やはり3件のみ抽出されました。
キーのPUB_IDのみで抽出すると48,934件でした。
BLOBを抽出した際にOKとなった3レコードの場所を見ると、特に隣接しているわけでもないようです。
最近のリリースノートを見ると、OCIとLOB関連のバグは相応にあるようで
やはりOCIドライバが使われていないか、OCI関数の呼び出しを回避する方法がないかを追求してみようかと思います。
Release | ID | 説明 | バージョン | ステータス |
2019.4 | DE19709 | Reading NCLOBs with OCI truncates data. | 2019.4.4.20206 | Fixed |
2019.4 | DE22751 | 32-bit OCI connections not working in 2019.4 release. | 2019.4.8.22007 | Fixed |
2020.2 | DE23679 | OCI で日本語のOracle テーブルに接続すると、ORA-00911 エラーが DataWrapOCI: クエリを準備できませんと表示します。 | 2020.2.2.27029 | 既知 |
2020.4 | DE27554 | OCI - 特殊文字やマルチバイト文字を使用すると CLOB エラーが発生する。 |
| 既知 |
2021.1 | DE27554 | 特殊文字およびマルチバイト文字を使用した場合の OCI CLOB エラー。 | 2021.1.2.20534 | 既知 |
2021.2 | DE28673 | LOB 列が (OCI 経由で) 複数ある場合、1 つの LOB 列のみを書き込むと、エンジンがクラッシュする。 |
| 解決済み |
2021.2 | DE29246 | OCI を使用して WString を CLOB に書き込むと、データが破損する。 |
| 既知 |
2021.2 | DE29247 | OCI を使用して文字列を BLOB フィールドに書き込むことができない。 |
| 既知 |
DE27554あたりが既知問題になっているので、そのあたりかもしれませんね・・・。
これが該当するのであれば特定の文字列が悪さをしている、ということになるかと思います・・・。
あと、「サポートされないデータ型」はストアドプロシージャの話のように見えますので、通常の読み出しであれば問題ないようにも見えます。
いずれにしてもOCI避けた方がよいかもしれないですね・・・(内部でOCI呼ばれるとNGですが・・・)