我正在开发应用程序(spring 框架 2.5 - 旧版本)。任务是使用'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));
}}
标准输出的输出是
output is {output2=null, output1=null}
我怀疑这与 Windows 版本 (Windows 10) 有某种联系 Java 版本 (1.7) Oracle驱动(ojdbc6.jar)
或其他东西 - 很明显我自己就能看到。
最佳答案
声明参数的顺序很重要。
参数的声明顺序应与它们在 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 框架引用中有描述:
关于java - 使用 Spring 的 org.springframework.jdbc.object.StoredProcedure 调用 Oracle 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798552/