Вызов функции оракула с использованием ссылки на базу данных - PullRequest
4 голосов
/ 05 мая 2011

Я создал функцию оракула с именем getEmployee(id in varchar) в моей удаленной базе данных, и я пытаюсь вызвать ее из локальной базы данных, используя ссылку на базу данных.

В getEmployee я пытаюсь вернутьсякурсор с данными сотрудника. (Таблица: Сотрудник (идентификатор, имя, адрес)):

SELECT schema.getEmployee@dblink(id) 
  FROM DUAL;

Как получить набор результатов с именем столбца (идентификатор, имя, адрес)?

Согласно Contrad, я изменил свою локальную функцию следующим образом:

FUNCTION LocalGetEmployee(ID in varchar2)
RETURN Schema.SomeRefCursor
AS  

OUTPUT Schema.SomeRefCursor;

BEGIN 

  OUTPUT := schema.getEmployee@dblink(ID);

  RETURN OUTPUT;
END;  

Но, когда я вызываю эту функцию из Java-кода, возникает следующая ошибка:

"ORA-24338: дескриптор оператора не выполнен "

Ответы [ 2 ]

6 голосов
/ 17 октября 2011

Получение курсора ссылки на удаленном сайте:

Допустим, у нас есть два сайта, участвующих в распределенной транзакции, Server1 и Server2. Курсор Ref, открытый на процедуре Server1, не может быть получен на сайте Server2. Если мы попытаемся извлечь этот курсор, оракул выдаст исключение:

[ORA-02055: distributed update operation failed; rollback required
 ORA-24338: statement handle not executed]

«Мы не можем использовать курсор ссылки поверх DBLink»

Решения:

  1. Использовать таблицу данных PL-SQL. OR
  2. Предоставить выбор гранта и использовать команду выбора через DBLink из инициатор сайта вместо открытия курсора.

Источник: Распределенная транзакция в Oracle (через Oracle DBLink)

0 голосов
/ 06 мая 2011

Насколько я могу сказать, ваш вопрос на самом деле не о ссылках на базы данных, а о том, как из Java-клиента вызвать функцию, которая возвращает курсор и извлекает данные из этого курсора. Я считаю, что единственный способ сделать это в Java - обернуть вызов функции в немного «процедурного» кода. У меня нет Oracle передо мной, так что это некоторые догадки:

String fncall = "begin ? :=  schema.getEmployee@dblink(?) end";
CallableStatement stm = con.prepareCall(fncall);
stm.registerOutParameter(1, Types.CURSOR);
stm.setInt(2, 123);
stm.execute();
ResultSet rs = (ResultSet) stm.getObject(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...