Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как получить курсор, который возвращает оракловая процедура?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Есть оракловая процедура, например:
create or replace
procedure P_REP_CUR
(
cCUR       in out PKG_CURSORS.CURTYPE
)
as
begin
  open cCUR for
    select * from DICT;
end;

Как вызвать процедуру из T-SQL через слинкованный сервер, чтобы получить курсор?
7 сен 12, 15:49    [13130899]     Ответить | Цитировать Сообщить модератору
 Re: как получить курсор, который возвращает оракловая процедура?  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
В Oracle сделайте еще одну оберточку - PIPELINED функцию, где в цикле фетчится этот курсор, а на стороне MSSQL-сервера через OPENQUERY вызывайте SELECT * из этой функции.
Таким образом можно через функцию в процедуру даже параметры передавать. Только тогда придется OPENQUERY втыкать в динамический запрос, поскольку он сам по себе параметров не разумеет.
7 сен 12, 16:22    [13131230]     Ответить | Цитировать Сообщить модератору
 Re: как получить курсор, который возвращает оракловая процедура?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Глеб
В Oracle сделайте еще одну оберточку - PIPELINED функцию, где в цикле фетчится этот курсор, а на стороне MSSQL-сервера через OPENQUERY вызывайте SELECT * из этой функции.
Таким образом можно через функцию в процедуру даже параметры передавать. Только тогда придется OPENQUERY втыкать в динамический запрос, поскольку он сам по себе параметров не разумеет.

Можно сделать что-то подобное без создания объекта в Oracle? Не мой сервер и не имею права создавать объекты. Могу только с помощью exec выполнять процедуры, ну или через openquery забирать данные. Обработка разного рода тоже мне доступна, лишь бы не создание объектов.
7 сен 12, 16:30    [13131307]     Ответить | Цитировать Сообщить модератору
 Re: как получить курсор, который возвращает оракловая процедура?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
ну или через openquery забирать данные.

И чего бы тогда не забрать их - select * from DICT ?
7 сен 12, 16:35    [13131362]     Ответить | Цитировать Сообщить модератору
 Re: как получить курсор, который возвращает оракловая процедура?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Glory, я упростила пример курсора, чтобы не писать лишний текст. В реале не будет простого запроса к таблице, который можно будет выполнить через OPENQUERY.
Тренируюсь на кошках, так сказать.
7 сен 12, 16:39    [13131392]     Ответить | Цитировать Сообщить модератору
 Re: как получить курсор, который возвращает оракловая процедура?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
Glory, я упростила пример курсора, чтобы не писать лишний текст. В реале не будет простого запроса к таблице, который можно будет выполнить через OPENQUERY.
Тренируюсь на кошках, так сказать.

В OPENQUERY можно помещать и сложные запросы.
7 сен 12, 16:40    [13131411]     Ответить | Цитировать Сообщить модератору
 Re: как получить курсор, который возвращает оракловая процедура?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Glory, к сожалению, я не ставлю себе задачу, а лишь выбираю способ (из урезанных действий) как мне ее решить.
На практике мне доступно несколько процедур в Oracle, которые имеют несколько входящих параметров и возвращают курсоры. Результаты процедур нужно обрабатывать дальше уже в T-SQL.
7 сен 12, 16:45    [13131472]     Ответить | Цитировать Сообщить модератору
 Re: как получить курсор, который возвращает оракловая процедура?  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Можно, но хлопотно. И я так не пробовал. Есть 2 варианта:

вариант 1
Технология ADO позволяет выполнять процедуру на Oracle с выходным параметром курсором. При этом формируется полноценный Recordset из курсора. На сайте MS есть соответсвующие статьи как это сделать.
А MSSQL позволяет вызвать ADO посредством процедур sp_OA***, при этом вариантный массив из объекта Recordset эти замечательные процедуры преобразуют в набор данных в MSSQL, такой же как от селекта, т.е. этот результат можно инсертить в таблицу или сразу отдавать клиенскому соединению.

вариант 2
CLR-функция, которая внутри через ADO.NET провайдер от Oracle читает курсор и транслирует в строки набора данных.

Сообщение было отредактировано: 7 сен 12, 16:49
7 сен 12, 16:47    [13131484]     Ответить | Цитировать Сообщить модератору
 Re: как получить курсор, который возвращает оракловая процедура?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
На практике мне доступно несколько процедур в Oracle, которые имеют несколько входящих параметров и возвращают курсоры. Результаты процедур нужно обрабатывать дальше уже в T-SQL.

T-SQL - это не язык написания клиентских приложений. Это язык для работы с наборами данных.
А вы пытаетесь микроскопом колоть орехи.
7 сен 12, 16:49    [13131499]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить