存储过程通过Java进行param

时间:2011-12-21 22:59:37

标签: java oracle stored-procedures jdbc

我在下面存储了proc:

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(可能是错误消息的简短描述)?

谢谢!

1 个答案:

答案 0 :(得分:2)

@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?,?而不仅仅是?; 21registerOutParameter代替getInt

或者使用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));