Вызов функции оракула с использованием ссылки на базу данных

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

В getEmployeeЯ пытаюсь вернуть курсор с данными сотрудника (таблица: Employee (ID, Name, address)):

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 ответа

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

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

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

"Мы не можем использовать Ref Cursor over DBLink"

Решения:

  1. Используйте таблицу данных PL-SQL. ИЛИ ЖЕ
  2. Укажите select grant и используйте команду select через DBLink с сайта инициатора вместо открытия курсора.

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

Насколько я могу судить, ваш вопрос на самом деле не о ссылках на базы данных, а о том, как из 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);
Другие вопросы по тегам