из Java, как вызвать хранимую процедуру, передавая курсор оракула в качестве аргумента - PullRequest
0 голосов
/ 28 июня 2011

Я использую 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? 

Ответы [ 2 ]

1 голос
/ 28 июня 2011

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

0 голосов
/ 28 июня 2011

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

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

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

...