【问题标题】:call Oracle stored procedure using Spring's org.springframework.jdbc.object.StoredProcedure使用 Spring 的 org.springframework.jdbc.object.StoredProcedure 调用 Oracle 存储过程
【发布时间】:2017-02-09 10:43:43
【问题描述】:

我正在开发应用程序(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) 爪哇版(1.7) Oracle 驱动程序(ojdbc6.jar)

或其他东西 - 很明显,我自己可以看到它。

【问题讨论】:

  • 已经知道答案了 - 但暂时不要打开,以防有人喜欢这样的测验。提示在这里“其他东西 - 显而易见”
  • 如果您知道答案,那么您应该将其发布为答案,它可能对其他人有所帮助。没有什么比谷歌解决问题更令人沮丧的了,在没有答案的情况下得到一个 SO 问题,但只有 OP 的评论,他在没有更多细节的情况下修复了该评论。
  • 对不起。谢谢你的评论。好点。

标签: java spring oracle jdbc spring-jdbc


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 2017-06-02
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2017-08-09
    相关资源
    最近更新 更多