Вызов функции оракула с использованием ссылки на базу данных
Я создал функцию оракула под названием 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"
Решения:
- Используйте таблицу данных PL-SQL. ИЛИ ЖЕ
- Укажите 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);