使用Spring的org.springframework.jdbc.object.StoredProcedure调用Oracle存储过程

时间:2016-09-30 19:11:49

标签: java spring oracle jdbc spring-jdbc

我正在开发应用程序(spring framework 2.5 - old one)。任务是使用'org.springframework.jdbc.object.StoredProcedure'调用oracle的存储过程

奇怪的是 - 它编译,执行,不抛出任何错误 - 并返回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));

}}

并且stdout的输出是

output is {output2=null, output1=null}

我怀疑这是以某种方式连接到Windows版本(Windows 10) java版本(1.7) Oracle驱动程序(ojdbc6.jar)

或其他 - 显而易见,我自己也可以看到它。

1 个答案:

答案 0 :(得分:1)

声明参数的顺序很重要。

参数的声明顺序与oracle过程或函数中出现的顺序相同。

在我的情况下,我不得不在类构造函数中重新排序这些参数声明,并将它们放在这样:

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框架参考中描述:

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