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

3
我正在开发一个应用程序(使用旧版的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)有关。

或者是其他什么原因,对我来说太明显了看不到。


已经知道答案了 - 但是现在还是保持开放状态,以防有人喜欢这样的测验。提示在这里:“还有其他东西 - 太明显了,看不见它”。 - Tomas Šatas
如果你知道答案,那么你应该将其发布为答案,这可能会帮助其他人。没有什么比在谷歌搜索问题时找到一个没有答案,只有OP评论说他已经解决了但没有进一步细节的SO问题更令人沮丧了。 - Mark Rotteveel
对不起。感谢您的评论。那是个好观点。 - Tomas Šatas
1个回答

2

声明参数的顺序非常重要。

参数应该按照它们在 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接