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

标签 java spring oracle jdbc spring-jdbc

我正在开发应用程序(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 框架引用中有描述:

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

关于java - 使用 Spring 的 org.springframework.jdbc.object.StoredProcedure 调用 Oracle 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798552/

相关文章:

java - 为什么 addTreeModelListener() 不起作用?

java - 原型(prototype)范围不工作

spring - 如何在 Spring 中最好地处理 RestController 中的 session ?

oracle - SQL*Plus 用户输入异常处理

regex - Oracle 在多行字符串中进行条件搜索

java - OrientationChange 不会破坏 Activity 吗?

java - 从Java中的高质量图像获取低质量缩略图

java - 错误:运行Map减少作业时出现org/jdom/JDOMException

spring - Ribbon 如何检索服务的可用实例列表

sql - SQL创建表在列使用%type