из java, как вызвать хранимую процедуру, передавая курсор оракула в качестве аргумента

Я использую Java + iBatis, и мне нужно вызвать хранимую процедуру Oracle, которая принимает курсор в качестве аргумента. Google не очень помог мне найти пример кода вызова хранимой процедуры, которая принимает курсор в качестве аргумента из java.

Как это можно сделать?

Сценарий по шагам:

 1. Java calls a Stored Proc passing primitives (varchar, char, etc) as
    parameters 
 2. Java retrieves the cursor returned from Step 1 
 3. Java calls a Stored Proc passing cursor from Step 2 as an argument  //how? 

person Omnipresent    schedule 28.06.2011    source источник


Ответы (2)


Если это действительно единственные шаги — т. е. вы не делаете ничего важного в Java между двумя вызовами — тогда для меня имеет больше смысла вообще избегать возврата к Java.

Если бы первая процедура была на самом деле функцией, вы могли бы просто выполнить один вложенный вызов:

BEGIN proc2(proc1(...)); END;

Курсор передается внутри Oracle и никогда не нуждается в обработке Java.

Если ваша первая процедура — это процедура, которая возвращает курсор как параметр OUT, вы можете написать для нее функцию-оболочку и сделать то же самое:

CREATE OR REPLACE FUNCTION func1(...)
  RETURN SYS_REFCURSOR
  AS
    foo SYS_REFCURSOR;
  BEGIN
    proc1(..., foo);
    RETURN foo;
  END func1;
/

Тогда BEGIN proc2(func1(...)); END; должно работать.

Теперь, если вам действительно нужно выйти на Java между двумя вызовами, я бы попробовал использовать OracleTypes.CURSOR при получении выходного значения из первой процедуры, а затем просто передать этот объект во вторую процедуру. Я не знаю, сработает ли это; если нет, то, вероятно, нет прямого способа сделать это.

person Dave Costa    schedule 28.06.2011
comment
есть еще шаги. Основная причина заключается в том, что SP на шаге 1 находится в одной БД, а SP на шаге 3 — в другой БД. Прямо сейчас мы обрабатываем это через DBLink, но мы ищем способы избежать ссылки на DB. Вот почему нам нужно вызвать SP на блоке 1, получить результаты, а затем передать эти результаты в SP на блоке 2. - person Omnipresent; 28.06.2011
comment
@Omnipresent: ах, ну, это меняет дело :) Совершенно невозможно передать открытый курсор из одного экземпляра в другой - курсор, по сути, является структурой в памяти экземпляра. - person Dave Costa; 28.06.2011
comment
больше Я исследую и не нахожу ничего, что заставило бы меня поверить, что это плохой путь. Спасибо - person Omnipresent; 28.06.2011
comment
@omnipresent: я серьезно сомневаюсь, что домашний обходной путь для dblink будет лучше, чем просто использование dblink. Это не идеально, но много усилий и размышлений было потрачено на использование dblinks (транзакции, согласованность чтения, поддержка и т. д.), это часть того, за что вы платите. Опять же, не решение для всего распределенного, но почему вы так стараетесь избегать dblinks? - person tbone; 28.06.2011

Вы не можете этого сделать.

Курсор, переданный в хранимую процедуру Oracle, представляет собой объект с API, который может предоставить только Oracle. Ваша Java-программа недостаточно знает о курсоре, чтобы создать какой-то объект, который будет проксировать его и перенаправлять вызовы обратно в Oracle.

Вам придется перепроектировать свое приложение, чтобы хранимая процедура, принимающая курсор ввода, вызывалась только из другой хранимой процедуры.

person antlersoft    schedule 28.06.2011
comment
Одна вещь, которую вы можете сделать, это прочитать данные для курсора и передать эти данные в виде вложенной таблицы в новую хранимую процедуру, которая вызовет хранимую процедуру с входным параметром курсора, используя курсор над переданными данными. Но это было бы гораздо менее эффективно, чем если бы курсор никогда не переходил на сторону Java. - person antlersoft; 28.06.2011
comment
интересно... Я попытаюсь убедить людей изменить базовую архитектуру, а не срезать углы. вот что означает это решение. - person Omnipresent; 28.06.2011