powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чудеса провайдера Oracle Provider for OLE DB
39 сообщений из 39, показаны все 2 страниц
Чудеса провайдера Oracle Provider for OLE DB
    #40024743
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Сегодня произошла очень интересная история, которой я не нахожу в принципе никакого объяснения. Хотел узнать какие могут быть соображения на эту тему и может кто то сталкивался с этим дивом дивным:)

На сервере существует уже лет 10 процесс, который инкрементально по максимальному id загружает данные с ораклового сервера
на сервер mssql.

Загрузка очень простая и имеет следующий вид:

Есть таблица
Код: sql
1.
dst_table (id bigint, val varchar(max))


Есть аналогичная таблица в оракле
Код: sql
1.
src_table (id bigint, val clob)



Загрузка работает в цикле загружая по 1000 строк, берется максимальный id из dst_table
и загружает с оракла 1000 строчек где id больше.

Код: sql
1.
2.
INSERT INTO dst_table 
SELECT id,val FROM OPENQUERY(ORA_SRC, 'SELECT id,val from (select id,val from src_table where id > [максимальный id из dst_table] order by id) where rownum <= 1000 ')



Сегодня перед глазами возникает следующая картина:

Поля val стали приходить из других строк таблицы, например в оракле есть такие строчки
id val
1 А
2 Б
3 В

А запрос возвращает:
id val
1 Ж
2 Б
3 З

1) Если написать запрос в oracle sql developer, то он возвращает правильные данные
2) Если в запросе вместо rownum <=1000 поменять на <=100, то запрос возвращает правильные данные
3) Если написать аналогичный запрос на другом сервере где есть такой же линк, то запрос возвращает правильные данные

А на текущем сервере вот такой цирк абсурда:) Получается драйвер Oracle Provider for OLE DB на сервере сошел с ума и его нужно переустанавливать?

ps - Я вменяем и трезв, коллеги сначала тоже упорно не верили пока им не показал это воочию)))
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024746
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
Поля val стали приходить из других строк таблицы, например в оракле есть такие строчки
То есть id возвращаются правильные?
Чудеса какие то.
А вы можете в оракле посмотреть, какой запрос туда приходит, и как он выполняется (в сиквеле эта штука называется профайлер)
И сравнить запрос от девелопера и от линка
Кстати, заодно убедитесь, что сервер прилинкован тот, который вам нужен :-)

99% за то, что ошиблись с сервером или схемой, которая у вас, кстати, в запросах не указана. В том числе со схемой можно ошибиться доп. параметрами коннекта.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024747
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, я писал покороче для примера, схемы там одинаковые.

При выполнении двух одинаковых запросов в одном окне, в зависимости от значения поля rownum получается либо корректное заполнение полей, либо нет.

Из интересного наблюдения когда rownum < 104, то данные возвращается корректно, при любом другом значении >= 104 некорректно
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024751
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пруфы :)
Заранее добавлю, это не может быть какое то другое поле c таким же evnum, тк в таблице нет дублей по полю evnum, там уникальный кластерный индекс
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024765
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

А что вернет

Код: sql
1.
select * from rm.sm3_reg_log where evnum = 9978530046;



Не мешало бы проверить как заполняется поле evnum на источнике.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024768
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
flexgen,
вернет верный результат как во втором примере
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024793
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
там уникальный кластерный индекс
Это же таблица, не вьюха?
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024794
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
assmsk
там уникальный кластерный индекс
Это же таблица, не вьюха?
А поле in_parms - это просто поле? Не вычисляемое?
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024797
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
alexeyvg, я писал покороче для примера, схемы там одинаковые.
Лучше просто скопируйте текст, а то если захочется написать имя поля и т.п., придётся их набирать, а не копировать :-)

И повторю совет, посмотрите профайлером (как он там в оракле называется)
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024803
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запросы выполняются в разное время, соответственно к далеко не полному множеству вариантов (наи-)возможных
причин указанных alexeyvg можно добавить различие данных в таблице на момент запроса.
evnum - это PK или они в исходнике не уникальны? (тем более что в первом наборе ограничение на 100 строк, а во втором на 200)
тип данных в источнике на evnum точно (big-)int? Бывает кто-то шаманит по настройкам драйверов (и как они конвертируют типы)
Можно почитать по Оракловской псевдо-функции rownum и гарантирует-ли она постоянность порядка строк.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024806
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
flexgen,
вернет верный результат как во втором примере


А если в
Код: sql
1.
select * from rm.sm3_reg_log where evnum = 9978530046

добавить все условия запроса? У тебя там еще два поля. Тоже вернет одну строку?

assmskуникальный кластерный индекс
Это где? В базе Oracle? В Oracle нет такого понятия "кластерный индекс". Ближе всего к кластерному индексу может быть index-organized table (IOT). Есть еще CLUSTER и соответственно CLUSTER INDEX, но это совсем другое.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024876
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flexgen
assmskуникальный кластерный индекс

Это где? В базе Oracle? В Oracle нет такого понятия "кластерный индекс". Ближе всего к кластерному индексу может быть index-organized table (IOT). Есть еще CLUSTER и соответственно CLUSTER INDEX, но это совсем другое.Наверное, автор сказал в терминах сиквела, что бы быть в контексте нашего раздела. Видимо, ПК имел в виду.
Но вообще самое правильное - дать DDL таблицы rm.sm3_reg_log
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40024977
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

rownum - это что, top ()? Если да, то нужен порядок сортировки.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025005
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

Ещё предположение, может, сиквельный OPENQUERY делает какое то "грязное" чтение? И в момент перемещения страниц или чего то подобного читает некий мусор?
Повторю в третий раз - нужно смотреть, что происходит на стороне Оракла.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025009
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудес не бывает, там или какое-то усечение, или дубли. Надо внимательно провести анализ данных.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025025
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну в целом я подобные ответы и предполагал, собственно тоже наехал сначала на владельцев системы что у них данные меняются... а зря

Но факты:
1) Поле evnum на источнике уникальное
2) В таблице ничего никогда не апдейтиться, туда только инкрементально записываются данные. 101% что поле IN_PARMS НЕ может поменяться
3) Есть 3 сервера msqlsql на которых настроен этот линк и оракл девелопер на локальной машине, через оракл девелопер и на двух серверах все работает хорошо и не возникает такой херни, а только на одном из серверов (тнс'ки везде одинаковые и драйвера тоже)


Мне самому с трудом вериться, что так себя может вести драйвер на конкретном сервере, но судя по всему это так и есть. Видимо придется обращаться в поддержку mssql...
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025039
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
assmsk,
внешний вид запросов к ораклу очень даже располагает к тому, чтобы нарваться на такую вот неприятную штуку .
С год назад получил некоторое количество неприятных ощущений на вываливании в дамп SQL сервера, как оказалось из-за любви к комментированию через --
Вроде как сносит процесс из-за бардака в куче, но если бардак маленький...
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025049
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
Видимо придется обращаться в поддержку mssql...
Они всё равно попросят хоть какую то информацию :-)
Если просто написать, как здесь "не работает", то результат будет такой же :-)
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025050
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

Код: plsql
1.
SELECT id,val from (select id,val from src_table where id > [максимальный id из dst_table] order by id) where rownum <= 1000

если я правильно понял, в Оракле очередная порция может содержать больше 1000 записей, а вы хотите затянуть из этой порции первую тысячу
обычно приведенный запрос так в Оракле и работает,
но есть ли исключения - лучше спросить на форуме Оракл

Зы: а есть ли ситуации, когда записи в Оракле комитятся не в порядке ид?


Хм: еще раз перечитал вопрос
мне не встречались ситуации, когда данные между строками перепутаны
хотя обмен между МССКЛ и Оракл с блобами у нас проходит регулярно
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025053
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
assmsk
Видимо придется обращаться в поддержку mssql...
Они всё равно попросят хоть какую то информацию :-)
Если просто написать, как здесь "не работает", то результат будет такой же :-)
наши админы обращались в МС по поводу обмена МССКЛ-ОРАКЛ
ответ - поменяйте версию клиента
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025056
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
Пруфы :)
Заранее добавлю, это не может быть какое то другое поле c таким же evnum, тк в таблице нет дублей по полю evnum, там уникальный кластерный индекс

выглядит так, как будто драйвер блобы перепутал между строками
в первом примере в строке *47 блоб похож на блоб со второго примера со строки *46
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025059
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
единственное реальное объяснение - sm3_req_log это представлениt с функцией, вытягивающей блоб
всё остальное похоже на глюки драйвера
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025068
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
Да, ровно так. Данные подтягиваются из других строк, хотя по некоторым записям все верно
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025069
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
andreymx,
Да, ровно так. Данные подтягиваются из других строк, хотя по некоторым записям все верно
нужен скрипт этой задачи, возможно, что-то подскажу
у нас была аналогичная ситуация
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025072
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
так вроде же примеры есть в теме или я не понял что именно требуется?
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025073
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
andreymx,
так вроде же примеры есть в теме или я не понял что именно требуется?
как реализовано представление и как достаете clob'ы
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025075
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
assmsk
andreymx,
так вроде же примеры есть в теме или я не понял что именно требуется?
как реализовано представление и как достаете clob'ы
хотя я не уверен что понимаю, на какой мой вопрос вы ответили положительно :)
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025088
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
rm.sm3_reg_log это таблица, в которой нет никаких вычисляемых полей в тч in_parms
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025095
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
andreymx,
rm.sm3_reg_log это таблица, в которой нет никаких вычисляемых полей в тч in_parms


Уверен что это таблица а не materialized view? И если это mview, то можно ли посмотреть скрипт его создания?
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025097
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
assmsk,

rownum - это что, top ()? Если да, то нужен порядок сортировки.


Это не top(), это pseudocolumn:
For each row returned by a query, the ROWNUM pseudocolumn returns a number indicating the order in which Oracle selects the row from a table or set of joined rows. The first row selected has a ROWNUM of 1, the second has 2, and so on.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025153
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
flexgen, уточнил, это таблица в классическом понимании
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025185
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flexgen,

в таком случае верно, это аналог TOP () без сортировки. А какой провайдер автор использует, оракловый (от производителя) соответствующий версии сервера Oracle?
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025191
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
flexgen,

в таком случае верно, это аналог TOP () без сортировки. А какой провайдер автор использует, оракловый (от производителя) соответствующий версии сервера Oracle?
в приведённом примере используется сортировка предыдущего подзапроса
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025199
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Вы уверены, что это номера строк именно вложенного запроса, а не запроса, результат которого был сформирован по набору данных, созданном вложенным запросом?
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025210
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
andreymx,

Вы уверены, что это номера строк именно вложенного запроса, а не запроса, результат которого был сформирован по набору данных, созданном вложенным запросом?
сорри
не понял тонкости вопроса
вот пример

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
SQL> WITH T(ID) AS
(
    SELECT 2 FROM dual UNION ALL
    SELECT 4 FROM dual UNION ALL
    SELECT 1 FROM dual UNION ALL
    SELECT 3 FROM dual UNION ALL
    SELECT 10 FROM dual
)
SELECT * FROM T WHERE ROWNUM <=2

        ID
----------
         2
         4

2 rows selected.


SQL> WITH T(ID) AS
(
    SELECT 2 FROM dual UNION ALL
    SELECT 4 FROM dual UNION ALL
    SELECT 1 FROM dual UNION ALL
    SELECT 3 FROM dual UNION ALL
    SELECT 10 FROM dual
)
SELECT * FROM (SELECT * FROM T WHERE ID < 3) WHERE ROWNUM <=2

        ID
----------
         2
         1

2 rows selected.


SQL> WITH T(ID) AS
(
    SELECT 2 FROM dual UNION ALL
    SELECT 4 FROM dual UNION ALL
    SELECT 1 FROM dual UNION ALL
    SELECT 3 FROM dual UNION ALL
    SELECT 10 FROM dual
)
SELECT * FROM (SELECT * FROM T WHERE ID < 3 ORDER BY ID) WHERE ROWNUM <=2

        ID
----------
         1
         2

2 rows selected.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025438
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk
flexgen, уточнил, это таблица в классическом понимании


Как данные обновляются в таблице? Кстати, озвучь версии SQL Server, Oracle Provider for OLEDB и Oracle DB. И Oracle client, если он установлен на SQL сервере.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025442
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flexgen
Кстати, озвучь версии SQL Server, Oracle Provider for OLEDB и Oracle DB. И Oracle client, если он установлен на SQL сервере.


Я тут кое-что нашел на support.oracle.com - Oracle Provider for OLE DB Intermittantly Returning Incorrect Data for Parameterized Query (Doc ID 1242984.1)

APPLIES TO:

Oracle Provider for OLE DB - Version 11.1.0.7 and later
Generic Windows
After migration to 11.1.0.7 parametrized queries are intermittently returning incorrect results.


SYMPTOMS

A parameterized query returns a specific set of data for one parameter. After querying with several different parameters and then reissuing the query with the first parameter the results are different than the results the first time the query was issued.


SOLUTION

The bug is fixed in the 11.1.0.7 Patch 33. Patch number 9773817 for Windows 32-bit and patch number 9773825 for x64 Windows.
The work around is to disable statement caching. In the connection string set the StmtCacheSize parameter to 0 to disable statement caching.


Не знаю, этот ли это случай, версия уж больно старая, но очень похоже.
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40025474
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flexgen
Я тут кое-что нашел на support.oracle.com - Oracle Provider for OLE DB Intermittantly Returning Incorrect Data for Parameterized Query (Doc ID 1242984.1)
у ТС в приведенном примере нет ни одного параметра
...
Рейтинг: 0 / 0
Чудеса провайдера Oracle Provider for OLE DB
    #40026448
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
flexgen
assmsk
flexgen, уточнил, это таблица в классическом понимании


Как данные обновляются в таблице? Кстати, озвучь версии SQL Server, Oracle Provider for OLEDB и Oracle DB. И Oracle client, если он установлен на SQL сервере.


Microsoft SQL Server 2016 (SP2-CU11-GDR) (KB4535706) - 13.0.5622.0 (X64) Dec 15 2019 08:03:11 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: )


Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE 12.2.0.1.0 Production
TNS for HPUX: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

С драйвером оракла че то не понятно, одновременно стоит 2 в списке драйверов:
1) Oracle in OraClient11g_home1 11.02.00.01
2) Oracle in OraClient12Home1 12.02.00.01
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чудеса провайдера Oracle Provider for OLE DB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]