Free Trial

ディスカッション - 日本語

答えを見つけ、質問し、Alteryx の専門知識を共有してください。

Oracle DBからBLOB型データを入力するとエラー: m_OCILobRead Error: OCI_NEED_DATA

Yoshiro_Fujimori
メテオール

入力データツールで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担当者と話すとしても、どのように話を持っていくか悩んでおります。

 

調査や解決に向けたアプローチなどアドバイス頂けると幸いです。

6件の返信6
AkimasaKajitani
オーロラ

@Yoshiro_Fujimori さん

 

BLOBと記載ありますがCLOBでしょうか?(BLOBはバイナリですが、記載を見るとテキストのようにお見受けしました)

まぁ、それが特に何かあるわけではないのですが、試すとしたら以下でしょうか。

 

1.接続用ドライバにOCIを使っていらっしゃるようなのでODBCやOleDBに変更してみる

2.InDBで一度接続し、データストリーム出力でAlteryxの方に持ってくる

 

取り急ぎ思いつくのはこのあたりでしょうか・・・。

 

Yoshiro_Fujimori
メテオール

@AkimasaKajitani さん

いつも迅速な回答ありがとうございます。

 

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ツールは使ったことがないので、試してみます。

Yoshiro_Fujimori
メテオール

InDB接続を調べたところ、以下のようにピンポイントでお断りされてしまいました orz

 

https://help.alteryx.com/ja/current/designer/oracle

サポートされないデータ型

次のデータ型はサポートされていないため、[ストアドプロシージャ] パラメータ値フィールドに入力できません。

・バイナリタイプ: raw、ロングプレーン、および BLOB

ストアドプロシージャにサポートされないデータ型が含まれている場合は、次の操作を行います。

・デザイナーは、データ型を [サポート外] に設定します。

・データ グリッドの値列は読み取り専用になり、[OK] ボタンは無効になり、ストアド プロシージャを実行できないことを示します

(CLOBならよかったのかな。。。)

 

キーを指定して、1行だけ持ってくるとうまくいく場合もあります

この辺から違い目を探ってみようかと考えております。

AkimasaKajitani
オーロラ

元々ご紹介頂いたURLで、Force SQL_WChar Support」オプションにチェックを入れるというのがありますが、こちらは試されてますでしょうか?

ワイド文字を強制的にサポートする、みたいなオプションみたいですが・・・。一部のUnicode文字で引っかかる場合はこのオプションが有効という風に読み取れます。

 

うまくいく場合というのがあるようですので、そういう特定の文字でひっかかっている可能性もあるかな、と思いました。

Yoshiro_Fujimori
メテオール

@AkimasaKajitani 

アドバイスありがとうございます。

 

Force SQL_WChar Support」オプションをオンにしてみましたが、やはり3件のみ抽出されました。

Yoshiro_Fujimori_1-1623800543867.png

Yoshiro_Fujimori_3-1623800683857.png

 

キーのPUB_IDのみで抽出すると48,934件でした。

BLOBを抽出した際にOKとなった3レコードの場所を見ると、特に隣接しているわけでもないようです。

Yoshiro_Fujimori_4-1623800866347.png

Yoshiro_Fujimori_5-1623801043716.png

最近のリリースノートを見ると、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 フィールドに書き込むことができない。

 

既知

 

AkimasaKajitani
オーロラ

DE27554あたりが既知問題になっているので、そのあたりかもしれませんね・・・。

これが該当するのであれば特定の文字列が悪さをしている、ということになるかと思います・・・。

 

あと、「サポートされないデータ型」はストアドプロシージャの話のように見えますので、通常の読み出しであれば問題ないようにも見えます。

 

いずれにしてもOCI避けた方がよいかもしれないですね・・・(内部でOCI呼ばれるとNGですが・・・)