Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов функции которая возвращает таблицу (MSSQL) / 8 сообщений из 8, страница 1 из 1
12.12.2018, 14:46
    #39746708
maxandsoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции которая возвращает таблицу (MSSQL)
У нас встала задача, необходимо по DBLINK вызвать функцию из MS/SQL которая возвращает таблицу и получить данные в Oracle

Пример функции
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE FUNCTION dbo.TestIsAm (@DT datetime)
RETURNS TABLE
AS
RETURN
SELECT TOP (100) DT, DT_Seazon, Week_Day, DayType
       FROM dbo.Calendar_Hours
       WHERE DT > @DT
ORDER BY DT


Вызов для примера

SELECT DT, DT_Seazon, Week_Day, DayType
       FROM dbo.TestIsAm ('20180101')



Пример вызова
Код: sql
1.
2.
SELECT DT, DT_Seazon, Week_Day, DayType
       FROM dbo.TestIsAm ('20180101')



Пока не подходит не один вариант((((

Может кто то сталкивался????
...
Рейтинг: 0 / 0
12.12.2018, 14:57
    #39746714
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции которая возвращает таблицу (MSSQL)
maxandsoftМожет кто то сталкивался?Тут на форуме кто-то каждые пару лет сталкивается.
...
Рейтинг: 0 / 0
12.12.2018, 15:02
    #39746720
maxandsoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции которая возвращает таблицу (MSSQL)
-2-,

Находил ветки, но там возврат описывался когда одна строка с одним значением, и это решение не подходит(
...
Рейтинг: 0 / 0
12.12.2018, 19:25
    #39746914
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции которая возвращает таблицу (MSSQL)
maxandsoftфункцию из MS/SQL которая возвращает таблицуодна из вещей, которая понравилась в MSSQL
...
Рейтинг: 0 / 0
12.12.2018, 19:55
    #39746929
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции которая возвращает таблицу (MSSQL)
maxandsoftНаходил веткиЕсли не умеешь пользоваться интернетом, пользуйся документацией.
...
Рейтинг: 0 / 0
13.12.2018, 00:23
    #39747030
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции которая возвращает таблицу (MSSQL)
maxandsoft
Находил ветки, но там возврат описывался когда одна строка с одним значением, и это решение не подходит(

Oracle табличная/pipelined фукнкция внутри которой DBMS_HS_PASSTHROUGH.

SY.
...
Рейтинг: 0 / 0
13.12.2018, 09:40
    #39747126
dba123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции которая возвращает таблицу (MSSQL)
maxandsoft,

Немного изменил пример из доки
Код: 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.
--mssqlserver
CREATE FUNCTION MY_TESTFUNC (@DT datetime)
RETURNS TABLE
AS
RETURN
SELECT TOP (100) id,n,s,dt
       FROM my_test
       WHERE DT > @DT
ORDER BY DT

--ora
DECLARE
  l_c	binary_integer;
  l_ret	binary_integer;
  l_id 	number;
  l_num	number;
  l_s	varchar2(200);
  l_dt 	date;

BEGIN
  l_c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@mssqllink;
  DBMS_HS_PASSTHROUGH.PARSE@mssqllink(l_c,'SELECT id,n,s,dt FROM MY_TESTFUNC(getdate()-2)');

  l_ret := 0;
  WHILE (TRUE)
  LOOP
    l_ret := DBMS_HS_PASSTHROUGH.FETCH_ROW@mssqllink(l_c,FALSE);
    DBMS_HS_PASSTHROUGH.GET_VALUE@mssqllink(l_c,1,l_id);
    DBMS_HS_PASSTHROUGH.GET_VALUE@mssqllink(l_c,2,l_num);
    DBMS_HS_PASSTHROUGH.GET_VALUE@mssqllink(l_c,3,l_s);
    DBMS_HS_PASSTHROUGH.GET_VALUE@mssqllink(l_c,4,l_dt);

    DBMS_OUTPUT.PUT_LINE('id='||l_id||' num='||l_num||' s='||l_s||' dt='||to_char(l_dt,'yyyymmdd hh24:mi:ss') );

    -- INSERT INTO TABLE_LOCAL VALUES(l_id,l_num,l_s,l_dt);
  END LOOP;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      BEGIN
        DBMS_OUTPUT.PUT_LINE('END OF FETCH');
        DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@mssqllink(l_c);
      END;
END;
/

id=4 num=12 s=тест2 dt=20181212 15:48:30
id=5 num=13 s=тест3 dt=20181212 15:49:02
END OF FETCH
...
Рейтинг: 0 / 0
13.12.2018, 14:30
    #39747407
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции которая возвращает таблицу (MSSQL)
Если нужна выборка в SQL, то:

MSSQL ф-ция:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE FUNCTION GetAgeGroups()  
  RETURNS TABLE  
    AS  
      RETURN  
        SELECT  [AgeGroupID],
                [StartAge],
                [EndAge]
          FROM  [AgeGroup]



Oracle типы+ф-ция:

Код: 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.
create or replace
  type AgeGroupObjType
    as object(
	      AgeGroupID varchar2(5),
	      StartAge   integer,
	      EndAge     integer
             )
/
create or replace
  type AgeGroupTblType
    as table of AgeGroupObjType
/
create or replace
  function GetAgeGroups
    return AgeGroupTblType
    pipelined
    is
        v_cursor binary_integer;
        v_obj    AgeGroupObjType := AgeGroupObjType(null,null,null);
    begin
        v_cursor := dbms_hs_passthrough.open_cursor@LINK_TO_MSSQL;
        dbms_hs_passthrough.parse@LINK_TO_MSSQL(v_cursor,'select * from [dbo].[GetAgeGroups]()');
        while dbms_hs_passthrough.fetch_row@LINK_TO_MSSQL(v_cursor) > 0 loop
          dbms_hs_passthrough.get_value@LINK_TO_MSSQL(v_cursor,1,v_obj.AgeGroupID);
          dbms_hs_passthrough.get_value@LINK_TO_MSSQL(v_cursor,2,v_obj.StartAge);
          dbms_hs_passthrough.get_value@LINK_TO_MSSQL(v_cursor,3,v_obj.EndAge);
          pipe row(v_obj);
        end loop;
        dbms_hs_passthrough.close_cursor@LINK_TO_MSSQL(v_cursor);
end;
/



Выполнение:

Код: 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.
SQL> select  *
  2    from  table(GetAgeGroups)
  3  /

AGEGR   STARTAGE     ENDAGE
----- ---------- ----------
<30            0         29
30-39         30         39
40-49         40         49
50-59         50         59
60-69         60         69
70+           70        999

6 rows selected.

SQL> select  *
  2    from  table(GetAgeGroups)
  3    where startage = 40
  4  /

AGEGR   STARTAGE     ENDAGE
----- ---------- ----------
40-49         40         49

SQL> 



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов функции которая возвращает таблицу (MSSQL) / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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