通过Param通过的存储过程 Java

我低于存储过程:


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//;
}
}


但她的错误

"Parameter Type Conflict".

有谁可以告诉我发生了什么?

另外,我可以返回额外的线条 return_string 在保存中 proc, 这将包含错误消息 oracle /可能是错误消息的简要说明/?

谢!
已邀请:

三叔

赞同来自:

问题 @Alex, 提到van den hoger,它非常相似,但使用功能,而不是似乎有点尴尬的程序。 本质是一样的; 您不会在通话中传递足够的参数 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//;


所以B.
prepareCall

,
?,?

反而
?

; 和
2

反而
1


registerOutParameter


getInt

.

或者使用您的更新程序
https://coderoad.ru/8598601/
, 还收到了错误消息:


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//;

要回复问题请先登录注册