2011-06-28 6 views
0

Я использую Java + iBatis и вам нужно вызвать хранимую процедуру Oracle, которая берет курсор в качестве аргумента. Google не очень помог мне найти пример кода, как вызвать хранимую процедуру, которая принимает курсор в качестве аргумента из java.из 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? 

ответ

1

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

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

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

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

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

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 при получении выходного значения из первой процедуры, а затем просто передать этот объект во вторую процедуру. Я не знаю, будет ли это работать; если нет, то, вероятно, нет прямого способа сделать это.

+0

есть еще несколько шагов. Основная причина заключается в том, что SP на шаге 1 находится на одной БД, а SP на шаге 3 находится на другой БД. Прямо сейчас мы обрабатываем это через DBLink, но мы ищем способы избежать связи с БД. Вот почему нам нужно вызвать SP на поле 1, получить результаты, а затем передать эти результаты в SP на поле 2 – Omnipresent

+0

@ Вообще-то: ах, хорошо, что делает вещи разными :) Нет абсолютно никакого способа передать открытый курсор из одного экземпляр для другого - курсор по существу является структурой в памяти экземпляра. –

+0

больше Я исследую и не нахожу ничего, заставляя меня поверить, что это плохой путь. спасибо – Omnipresent

0

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

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

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

+0

Одна вещь, которую вы можете сделать, это прочитать данные для курсора и передать эти данные в виде вложенной таблицы в новую хранимую процедуру, которая вызовет сохраненный процесс с помощью параметра ввода курсора, используя курсор над переданными данными. Но это было бы намного менее эффективно, чем если бы курсор никогда не переходил на сторону Java. – antlersoft

+0

интересно ... Я попытаюсь убедить людей изменить базовую архитектуру, а не разрезать углы. вот что означает это решение. – Omnipresent