2016-09-30 5 views
3

Я разрабатываю приложение (весенняя основа 2.5 - старая). Задача состоит в том, чтобы вызвать хранимую процедуру oracle, используя «org.springframework.jdbc.object.StoredProcedure»вызов Oracle хранимой процедуры с использованием Spring.springframework.jdbc.object.StoredProcedure

Странно, что это - он компилирует, выполняет, не выдает ошибок и возвращает значение null вместо реального значения.

Моя процедура тестирования (она находится в пакете) выглядит следующим образом:

procedure testprocedure(input1 IN varchar2, 
    input2 IN varchar2, 
    output1 OUT VARCHAR2, 
    output2 OUT VARCHAR2) 
IS 
BEGIN 
    output1 := 'return1'; 
    output2 := 'return2'; 
END testprocedure; 

Java код:

public class TestClass extends StoredProcedure { 
public static final String input1 = "input1"; 
public static final String input2 = "input2"; 
public static final String output1 = "output1"; 
public static final String output2 = "output2"; 

public TestClass() { 
    setSql("testpackage.testprocedure"); 
    setFunction(false); 
    declareParameter(new SqlOutParameter(output1, Types.VARCHAR)); 
    declareParameter(new SqlOutParameter(output2, Types.VARCHAR)); 
    declareParameter(new SqlParameter(input1, Types.VARCHAR)); 
    declareParameter(new SqlParameter(input2, Types.VARCHAR)); 
} 

public TestReturn getTestProcedureOUTs (String pinput1, String pinput2) { 
    Map<String, Object> in = new HashMap<String, Object>(); 
    in.put(input1, pinput1); 
    in.put(input2, pinput2); 

    System.out.println("Calling " + getSql() + " with parameters: " + in); 

    Map<String, Object> res = execute(in); 
    System.out.println("output is " + res); 
    return new TestReturn((String) res.get(output1), (String) res.get(output2)); 

}} 

и выход из стандартного вывода является

output is {output2=null, output1=null} 

Я подозреваю, это как-то связано с версией Windows (окна 10) java version (1.7) Драйвер Oracle (ojdbc6.jar)

или что-то еще - к очевидному, чтобы увидеть его сам.

+0

уже знают ответ - но оставит это открытым пока, в случае, если кто-то любит викторины вроде этого. Подсказка здесь «что-то еще - чтобы это было очевидно» –

+0

Если вы знаете ответ, тогда вы должны опубликовать это как ответ, это может помочь другим. Ничто так не расстраивает, как Google для проблемы, добирайтесь до вопроса SO без ответа, но только комментарий OP, который он исправил без дальнейших подробностей. –

+0

Я сори. Спасибо за этот комментарий. Хороший момент. –

ответ

1

Важным является порядок заявленных параметров.

Параметры должны быть объявлены в том же порядке, что и в процедуре или функции оракула.

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

public TestClass() { 
    setSql("testpackage.testprocedure"); 
    setFunction(false); 
    declareParameter(new SqlParameter(input1, Types.VARCHAR)); 
    declareParameter(new SqlParameter(input2, Types.VARCHAR)); 
    declareParameter(new SqlOutParameter(output1, Types.VARCHAR)); 
    declareParameter(new SqlOutParameter(output2, Types.VARCHAR)); 
} 

И это поведение описано в Spring Framework ссылки:

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/object/StoredProcedure.html

Смежные вопросы