powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов функции в гетерогенном запросе
9 сообщений из 9, страница 1 из 1
Вызов функции в гетерогенном запросе
    #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
Вызов функции в гетерогенном запросе
    #39324685
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter,

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

Executing User-Defined Functions on a Non-Oracle Database
Скорее всего, ты уже это уже видел
...
Рейтинг: 0 / 0
Вызов функции в гетерогенном запросе
    #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
Вызов функции в гетерогенном запросе
    #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
Вызов функции в гетерогенном запросе
    #39324873
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_hs_passthrough.execute_immediate
...
Рейтинг: 0 / 0
Вызов функции в гетерогенном запросе
    #39324874
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и поискать по форуму по этим словам
...
Рейтинг: 0 / 0
Вызов функции в гетерогенном запросе
    #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
Вызов функции в гетерогенном запросе
    #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
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов функции в гетерогенном запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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