我正在开发应用程序(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)
或其他 - 显而易见,我自己也可以看到它。
答案 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框架参考中描述: