【问题标题】:Stored Procedure Out param through Java通过 Java 存储过程输出参数
【发布时间】:2012-01-25 17:16:15
【问题描述】:

我在下面存储过程:

CREATE OR REPLACE PROCEDURE "demo"."run_demo"(v_sql IN VARCHAR2, return_code OUT number)
AS

i number;

BEGIN
return_code := 0;
execute immediate v_sql;
i := sql%rowcount;

    IF (i<1)
    THEN return_code := 1;
END IF;

EXCEPTION  
    WHEN OTHERS THEN
    return_code := SQLCODE;
END;

我正在尝试从 Java 调用它,如下所示:

public static void main(String[] args) {
    try {
        Class.forName("oracle.jdbc.OracleDriver");      
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.10.10.10:1521:demo", "demo_app", "demo");

        CallableStatement cs = conn.prepareCall("{call demo.run_demo(?)}");
        cs.registerOutParameter(1, Types.INTEGER);
        cs.setString(1, "update demo.users set locale=''english'' where user_id = 2");

        cs.execute();

        System.out.println("out="+cs.getInt(1));
    } catch (Exception e) {         
        e.printStackTrace();
    }
}

但它的返回错误

“参数类型冲突”。

谁能告诉我怎么了?

另外,如何在存储过程中返回包含 oracle 错误消息(可能是错误消息的简短描述)的附加 return_string?

谢谢!

【问题讨论】:

  • 您似乎缺少一个参数。如果您搜索过 SO,您会发现:stackoverflow.com/questions/2585550/…
  • 我尝试添加? = 调用 demo.run_demo(?) 但这也无济于事。谁能帮帮我?
  • 试试 cs.registerOutParameter(1, Types.DECIMAL);而不是 cs.registerOutParameter(1, Types.INTEGER);

标签: java oracle stored-procedures jdbc


【解决方案1】:

@Alex van den Hoogen 提到的问题非常相似,但是使用的是函数而不是过程,这似乎让您有些困惑。要点是一样的;您没有在 Java 调用中传递足够的参数 - 您正在设置并获得相同的位置参数,编号 1。您需要执行以下操作:

CallableStatement cs = conn.prepareCall("{call demo.run_demo(?,?)}");
cs.setString(1, "update demo.users set locale=''english'' where user_id = 2");
cs.registerOutParameter(2, Types.INTEGER);

cs.execute();

System.out.println("out="+cs.getInt(2));

所以在prepareCall, ?,? 而不是?;和2 而不是registerOutParametergetInt 中的1

或者使用来自您的later question 的更新程序,也会收到错误消息:

CallableStatement cs = conn.prepareCall("{call demo.run_demo(?,?,?)}");
cs.setString(1, "update demo.users set locale=''english'' where user_id = 2");
cs.registerOutParameter(2, Types.INTEGER);
cs.registerOutParameter(3, Types.VARCHAR);

cs.execute();

System.out.println("out="+cs.getInt(2) + ":" + cs.getString(3));

【讨论】:

  • 如何注册出数组类型的参数?我正在尝试这个 - `cs.registerOutParameter(2, Types.ARRAY, "CUSTOM_TYPE"); //类型在过程中定义 Array arr = cs.getArray(2);结果集 rs = arr.getResultSet(); ` 当我试图解析结果集时。我收到 ResultSetMetaData 是不受支持的功能的异常。我的 CUSTOM_TYPE 是一个复杂的 Java 对象,它内部还有其他子 Java 对象。或者,对于自定义类型,类型应该是对象?如果需要,我可以发布一个新问题。
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多