none
ORACLEとのDBLINK時のSELECT結果が正しく取得できない RRS feed

  • 質問

  • ORACLE側の画像ファイルが登録されているデータテーブルから、SQLSERVERでDBLINKでデータを取得している処理があります。

    ※ORACLE側のテーブル構成は、社員番号(VARCHAR2)と画像データ(BLOB )
    ※ORACLEのバージョンは11.2.0.4です。

    SQLSERVER 2008 R2 から、SELECTでデータを取得した場合は正しい値が取得できております。
    SQLSERVER 2017 から SELECTでデータを取得したところ、異なる値が取得されております。
    (社員番号を指定してSELECTしているにも関わらず、違う社員番号の画像データが取得できております。)

    SELECT文自体は、下記のようにシンプルな内容になります。
    SELECT
       SYAINCD,
       FILEDATA
    FROM [DBLINK]..[USER].[TABLE]
    WHRE SYAINCD = '9999'

    上記事象の原因お分かりになる方いらっしゃいましたらご教示願います。

    2020年6月11日 9:28

すべての返信

  • SQLSERVERでDBLINKでデータを取得している処理があります。

    SQL Server の「リンクサーバー (Linked Servers)」の話なのか、
    Oracle の「データベースリンク」(Database Link)」の話なのか、
    状況を読み切れていないまま、思い付きで書いてしまいますが…。

    接続先情報が誤っているパターンと、何らかの理由でパラメーターの受け渡しが失敗して別の値として処理されているパターンが思い当たりました。

    Oracle サーバー側でトレースログを確認してみるというのは如何でしょうか。

    2020年6月11日 10:42
  • 現象として、該当のクエリを実行した場合、SYAINCDに '9999' 以外のデータが結果セットとして戻されているのでしょうか?

    問題の切り分けとして、OPENQUERY 経由で実行した場合、結果は変わりますでしょうか?

    OPENQUERY (Transact-SQL)
    https://docs.microsoft.com/ja-jp/sql/t-sql/functions/openquery-transact-sql?view=sql-server-ver15


    2020年6月11日 14:23
  • 早速のご回答頂きまして、ありがとうございます。

    本件は、SQL Server の「リンクサーバー (Linked Servers)」での処理になります。

    また、ご教示頂きましたトレースログについて、さっそく確認したいと思うのですが、実施まで少々時間がかかる見込みです。

    ログ調査に進展ありましたら、ご報告させていただきたく考えておりますので、何卒よろしくお願いいたします。

    2020年6月12日 6:37
  • ご確認およびご質問いただき、ありがとうございます。

    現象として、該当のクエリを実行した場合、SYAINCDに '9999' 以外のデータが結果セットとして戻されているのでしょうか?

    SYAINCDには '9999' がセットされますが、FILEDATAに「SQLSERVER 2008 R2」と「SQLSERVER 2017」で異なる値がセットされております。

    問題の切り分けとして、OPENQUERY 経由で実行した場合、結果は変わりますでしょうか?

    ご教示頂いた内容試してみたいと思うのですが、実施まで少々時間がかかる見込みです。

     確認でき次第、改めてご連絡させていただきますので、よろしくお願いいたします。

    2020年6月12日 6:42
  • OPENQUERYでクエリを実行した場合、Oracle 側で実行するクエリの構文解析が行われ、クエリの実行が行われた後、その結果セットが SQL Server に返されるようになります。

    これで現象が改善すると良いのですが。


    2020年6月12日 10:49