SQL Serverデータベースに対するOracleクエリは、一貫性のない結果をもたらします
-
16-10-2019 - |
質問
OG4ODBCデータベースリンクを使用した複数のOracle 11.2.0.2データベースがSQL Server 2008データベースにリンクされています。 SQL Serverデータベースの特定のテーブルには、2つのVarchar(36)列があります。次のステートメントは1292行を返します。
select "id", "folder_id" from dbo.mediasite_presentation@ms;
最初の列の特定の値をクエリすると、行が返されます。
select "id", "folder_id" from dbo.mediasite_presentation@ms
where "id"='006d815d-6e9e-4004-9104-51213a1ecd52';
id folder_id
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 54aa9b6e-1c55-4de5-a06f-033d8b19fff0
ただし、2番目の列の特定の値をクエリすると、行はありません。
select "id", "folder_id" from dbo.mediasite_presentation@ms
where "folder_id"='54aa9b6e-1c55-4de5-a06f-033d8b19fff0';
no rows selected
WHERE句を使用して、TO_CHARで各フィールドをラッピングすると、次の興味深い結果が返されます。
select to_char("id"), to_char("folder_id") from dbo.mediasite_presentation@ms
where "id"='006d815d-6e9e-4004-9104-51213a1ecd52';
TO_CHAR("ID") TO_CHAR("FOLDER_ID")
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 ┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐
興味深いことに、Rownum句を追加するだけで同じ結果を作成できます。
select "id", "folder_id" from dbo.mediasite_presentation@ms
where "id"='006d815d-6e9e-4004-9104-51213a1ecd52' and rownum<=1;
id folder_id
------------------------------------ ------------------
006d815d-6e9e-4004-9104-51213a1ecd52 ┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐
見知らぬ人でさえ、データを返さないクエリの具体化されたビューを作成することは、実際にデータを返しているという事実です。
Create Materialized View TempMV as (
select "id", "folder_id" from dbo.mediasite_presentation@ms
where "folder_id"='54aa9b6e-1c55-4de5-a06f-033d8b19fff0' and rownum<=1);
Materialized view created.
select * from TempMV;
id folder_id
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 54aa9b6e-1c55-4de5-a06f-033d8b19fff0
このパズルの一部しか説明できない場合でも、答えてください。
解決
キャラクターセットの変換の問題のいくつかが疑わしいです。 TO_CHARを行うと、「┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐」(18文字)に戻ります。これは、列に含まれるデータがシングルバイトかマルチバイトであるかについて、ある程度の混乱があることを示唆しています。
「SQL Serverの一意のIdentifierデータ型は、16バイトのバイナリ値としてネイティブに保存されています」これは、理想的にはVarchar2またはcharではなく生データ型としてOracleに出くわすはずです。
あなたがするならば
CREATE VIEW temp_view as select "id", "folder_id" from dbo.mediasite_presentation@ms
DESC TEMP_VIEWを実行すると表示されます
所属していません dba.stackexchange