Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов функции в гетерогенном запросе / 9 сообщений из 9, страница 1 из 1
11.10.2016, 14:52
    #39324579
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
Для связи с базой MSSQL Server из Oracle использую механизм гетерогенных запросов. Создал DBLink на БД на SQL Server'е и успешно тяну из PL-SQL данные из таблиц БД SQL Server'а, например вот так:

Код: plsql
1.
select * from tbl1_sqlsrv@mssqllink.bes.local



Но это если обращаться к таблицам или представлениям, а возможно ли вызывать функции с параметрами?

Вот так не получается:

Код: plsql
1.
select fun1_sqlsrv(100,'abc')@mssqllink.bes.local from dual


Код: plsql
1.
select fun1_sqlsrv@mssqllink.bes.local(100,'abc') from dual
...
Рейтинг: 0 / 0
11.10.2016, 16:30
    #39324685
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
verter,

может надо использовать че-то типа анонимного блока?
...
Рейтинг: 0 / 0
11.10.2016, 17:09
    #39324726
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
verter,

Executing User-Defined Functions on a Non-Oracle Database
Скорее всего, ты уже это уже видел
...
Рейтинг: 0 / 0
11.10.2016, 17:45
    #39324765
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
--Eugene--verter,

Executing User-Defined Functions on a Non-Oracle Database
Скорее всего, ты уже это уже видел

Спасибо, в мануале написано так:

You can execute user-defined functions in a remote non-Oracle database. For example:

Код: plsql
1.
SELECT getdeptforemp@Remote_DB(7782) FROM dual



Я делаю так же

Код: plsql
1.
select fun_sqlsrv@mssqllinkl('abc') from dual



Но получаю ошибку: 'fun_sqlsrv': invalid identifier

Функция у меня в той же Remote_DB что и представления, к которым я успешно обращаюсь из PL-SQL. Владелец тот же dbo.
...
Рейтинг: 0 / 0
11.10.2016, 18:21
    #39324797
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
verter,

я там видел че-то типа:As a security measure, you must specify the functions that you want to execute remotely and their owners in the HS_CALL_NAME parameter in the gateway-specific initialization parameter file. For example:
Код: plaintext
HS_CALL_NAME = "owner1.A1, owner2.A2 "
может собака где-то рядом?
...
Рейтинг: 0 / 0
11.10.2016, 21:06
    #39324873
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
dbms_hs_passthrough.execute_immediate
...
Рейтинг: 0 / 0
11.10.2016, 21:06
    #39324874
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
ну и поискать по форуму по этим словам
...
Рейтинг: 0 / 0
12.10.2016, 11:14
    #39325124
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
--Eugene--verter,

я там видел че-то типа:As a security measure, you must specify the functions that you want to execute remotely and their owners in the HS_CALL_NAME parameter in the gateway-specific initialization parameter file. For example:
Код: plaintext
HS_CALL_NAME = "owner1.A1, owner2.A2 "
может собака где-то рядом?

В файле настроек гетерогенного сервиса оракла initdg4odbc.ora добавил этот параметр с именем функции и её владельцем.
Перезапустил службы лисенера и базы. Не помогло :( Так же пишет, что неизвестный идентификатор.
...
Рейтинг: 0 / 0
12.10.2016, 11:51
    #39325172
landy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции в гетерогенном запросе
Может подойдет - делал вот так для MS SQL(на примере xp_cmdshell)
Код: sql
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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
create database link FPTST connect to user1 identified by pswd1 using 'FP';

select * from dba_db_links;

select count(*) from sysusers@FPTST;

create or replace
PROCEDURE test_call
is
declare c             INTEGER;
        nr            INTEGER;
        v_sql         VARCHAR2(32767);
    
BEGIN

    v_sql :='EXEC xp_cmdshell [cmd /c dir c:\  > c:\temp\dir.lst ]';

    c  := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@FPTST;

    DBMS_HS_PASSTHROUGH.PARSE@FPTST(c,  v_sql );
    nr := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@FPTST(c);
    DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@FPTST(c);
END;
/
    
DECLARE
    RESULT NUMBER(8, 2);
    val  INTEGER;
    c    INTEGER;
    nr   INTEGER;
BEGIN

    c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@FPTST;
    DBMS_HS_PASSTHROUGH.PARSE@FPTST(c,  'exec xp_cmdshell [ dir c:\ ]');
    LOOP
        nr := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@FPTST(c);
        EXIT WHEN nr = 0;
        DBMS_HS_PASSTHROUGH.GET_VALUE@FPTST(c,  1,  val);
    END LOOP;
    DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@FPTST(c);
    DBMS_OUTPUT.PUT_LINE('retrieved: ' || val);
END;
/
rollback

DECLARE
    RESULT NUMBER(8, 2);
    val  INTEGER;
    c    INTEGER;
    nr   INTEGER;
BEGIN

    c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@FPTST;
    DBMS_HS_PASSTHROUGH.PARSE@FPTST(c,  'exec xp_cmdshell [ dir c:\ ]');
    LOOP
        nr := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@FPTST(c);
        EXIT WHEN nr = 0;
        DBMS_HS_PASSTHROUGH.GET_VALUE@FPTST(c,  1,  val);
    END LOOP;
    DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@FPTST(c);
    DBMS_OUTPUT.PUT_LINE('retrieved: ' || val);
END;
/
   
DECLARE
    RESULT NUMBER(8, 2);
    val  INTEGER;
    c    INTEGER;
    nr   INTEGER;
BEGIN

    RESULT := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@FPTST('exec xp_cmdshell [ dir c:\ ]');
    c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@FPTST;
    DBMS_HS_PASSTHROUGH.PARSE@FPTST(c,  'exec xp_cmdshell [ dir c:\ ]');
    LOOP
        nr := DBMS_HS_PASSTHROUGH.FETCH_ROW@FPTST(c);
        EXIT WHEN nr = 0;
        DBMS_HS_PASSTHROUGH.GET_VALUE@FPTST(c,  1,  val);
    END LOOP;
    DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@FPTST(c);
    DBMS_OUTPUT.PUT_LINE('retrieved: ' || val);
END;
/
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов функции в гетерогенном запросе / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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