powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выполнение запроса из Oracle в базу MS SQL. Агрегативный
10 сообщений из 10, страница 1 из 1
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646488
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Выполняю запрос из оракла в базу ms sql, если не использую Group by, то данные извлекаются, а как только прикручиваю Group by - выдается ошибка "Ошибка предобработки Гетерогенными службами", при чем подчеркивает в коде строку выбора по дате... не пойму куда копать...

Запрос простой:

SELECT
h1.HAR, n1.NOMENK, Sum(z1.ZER)
FROM
T_OPER@MSQL2 o2,
T_SMEN@MSQL2 s2,
T_SOTRUD@MSQL2 ss2,
T_PODR@MSQL2 p2,
T_ANALIZ@MSQL2 o1,
T_NOMENKLAT@MSQL2 n1,
T_HAR_ANALIZ@MSQL2 h1,
T_ZER@MSQL2 z1
WHERE o2.DATA = to_char('20180517')
AND o2.SMEN = s2.SMEN_KOD
AND o2.BRIG = ss2.SOTRUD
AND o2.PODR = p2.PODR
and o1.ID=o2.ID
and o1.NOMEN= n1.NOMEN
and h1.ANALIZ = o1.ANALIZ
AND h1.ZER = z1.ZER
Group by h1.HAR, n1.NOMENK


Если убираю в Selecte - Sum и строку Group by - то запрос выполняется без ошибок...
Если оставляю, то при ошибке подчеркивает первый апостроф в строке to_char('20180517')
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646489
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Grizzly,

перепиши на join
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646494
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Grizzly,
и вот это смущает:

o2.DATA = to_char('20180517')

масло масленное

в MSSQL это поле типа date или как?
если date, то преобразуй с помощью to_date
если строка, то просто

o2.DATA = '20180517'

ну и т. д.
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646498
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторo2.DATA - это datetime формат в MSSQL.
Пробовал to_date('17.05.2018','dd.mm.yyyy')
Запрос висит минуту, а потом выдает ошибку [FreeTDS][SQL Server] Преобразование типа данных varchar в тип данных datetime привело к выходу значения за пределы диапазона. {22007, NativErr = 242}
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646499
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При чем до смешного доходит - o2.DATA ='20180517' - Ошибка предобработки Гетерогенными службами
а вот с to_char() ошибка не появляется, если нет Group
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646505
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это как-то связано с FreeTNS под Unix, если я меняю на другой tns использующий подключение к MSSQL через Windows ODBC, то запрос выполняется (но задача стоит - уйти от Windows поэтому FreeTNS подвернулся первым)
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646514
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выньте дату из MSSQL, посмотрите.
У меня было такое:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Connected to Oracle Database 11g Release 11.2.0.1.0 
Connected as supermag@DBOFFICE

SQL> 
SQL> select head."_Number" NUM_HEAD, head."_Date_Time" - 730485 DATE1
  2              from "dbo"."_Document540"@DB1C head
  3             where rownum < 2;

NUM_HEAD                DATE1
----------------------- -----------
Н0000034178             14.05.2018

SQL> 
SQL> select head."_Number" NUM_HEAD, head."_Date_Time" DATE1
  2              from "dbo"."_Document540"@DB1C head
  3             where rownum < 2;

NUM_HEAD                DATE1
----------------------- -----------
Н0000034178             14.05.4018

SQL> 



Не разбирался, просто вычел 2000 лет :).
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646533
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В подобных случаях лучше отдавать запрос на сторону исполнения, чтобы он выполнялся целиком в источнике, по его правилам.
Без ненужных и зачастую не понятных быстро конвертаций между разными диалектами sql (это не только к MS SQL относится, а и к другим, в том числе малоиспользуемым базам).

для гетеродинных служб и подобных задач у оракла есть хороший пакет

DBMS_HS_PASSTHROUGH

можно сделать табличную функция с ним, подставляя запрос и вызывать потом селект из неё.

я тут набросал по твоему кейсу:

Код: 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.
53.
create or replace package pkg_1 is

  type str_msrs is record(
    T_HAR  INTEGER, --нужный оракловый тип поля
    T_NOMENK varchar2(128), -- нужный оракловый тип поля
    T_SUM   number(38, 15); -- нужная размерность
  type list_msrs is table of str_msrs;

  function get_data_msrs(dt date) return list_msrs
    pipelined;

end pkg_1;

create or replace package body pkg_1 is

  function get_data_msrs(dt date) return list_msrs
    pipelined is
    cur_msrs INTEGER;
    rowcur INTEGER;
    rec_i  str_msrs;
  begin
  
    cur_msrs := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@MSQL2;
    DBMS_HS_PASSTHROUGH.PARSE@fb_rdu_prom(cur_msrs,                                          
    'SELECT h1.HAR, n1.NOMENK, Sum(z1.ZER) as sum  FROM  T_OPER o2 ' ||
    ' join T_SMEN s2 on o2.SMEN = s2.SMEN_KOD' ||
    ' join T_SOTRUD on ss2 on o2.BRIG = ss2.SOTRUD' ||
    ' join T_PODR p2 on o2.PODR = p2.PODR' ||
    ' join T_ANALIZ o1 on o1.ID=o2.ID' ||
    ' join T_NOMENKLAT n1 on o1.NOMEN= n1.NOMEN' ||
    ' join T_HAR_ANALIZ h1 on h1.ANALIZ = o1.ANALIZ' ||
    ' join T_ZER@MSQL2 z1 on h1.ZER = z1.ZER' ||
    ' WHERE o2.DATA = convert(datetime, ' || to_char(dt,'yyyymmdd') || ',112)'||
    ' Group by h1.HAR, n1.NOMENK');
    loop
      ROWCUR := DBMS_HS_PASSTHROUGH.FETCH_ROW@MSQL2(cur_msrs);
      EXIT WHEN ROWCUR = 0;
      DBMS_HS_PASSTHROUGH.GET_VALUE@MSQL2(cur_msrs,
                                                1,
                                                rec_i.T_HAR);
      DBMS_HS_PASSTHROUGH.GET_VALUE@MSQL2(cur_msrs,
                                                2,
                                                rec_i.T_NOMENK);
                                                                                      
      DBMS_HS_PASSTHROUGH.GET_VALUE@MSQL2(cur_msrs,
                                                3,
                                                rec_i.T_SUM);      
    
      pipe row(rec_i);
    end loop;   
  end;

end pkg_1;


обрати внимание, что мы отдаём работу с датой на сторону источника.

Ну и итоговый вызов будет c подстановкой нужной даты:
Код: plsql
1.
select * from table(pkg_1.get_data_msrs(to_date('20180517','yyyymmdd')))


Допилить и расширить можно, если хотеть сделать общую функцию для вызова разных запросов. Естественно будет ограничено типами и количеством итоговых полей.
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646593
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторDBMS_HS_PASSTHROUGH
Вот это уже поинтересней будет, ща попробую завернуть его в свой код, проверю как себя поведет. Спасибо!

авторВыньте дату из MSSQL, посмотрите
Любопытный результат у вас получился... Обязательно проверю что у меня там. Спасибо!
...
Рейтинг: 0 / 0
Выполнение запроса из Oracle в базу MS SQL. Агрегативный
    #39646609
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Grizzly, на здоровье )

В одном месте копипасту не заметил
DBMS_HS_PASSTHROUGH.PARSE@fb_rdu_prom(

разумеется, везде после собаки ваш дблинк

в остальном - рабочий код (копипаста с моего личного), не зависит от типа драйвера...

пакет этот хорош: всё, в том числе оптимизацию отдаёт на сторону источника.

когда так соединяете
FROM
T_OPER@MSQL2 o2,
T_SMEN@MSQL2 s2
то выборка по каждой из таблиц тащится на сторону оракла и соединяется уже на вашей стороне - лишняя нагрузка, от которой можно избавиться, отдав все расходы в источник
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выполнение запроса из Oracle в базу MS SQL. Агрегативный
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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