OracleCallableStatement registerOutParameter不喜欢命名绑定

时间:2010-08-24 01:08:38

标签: java jdbc

此代码提供“错误设置或注册参数”SQLException。有人可以帮忙吗?

OracleConnection conn = getAppConnection();
String q = "BEGIN INSERT INTO tb (id) values (claim_seq.nextval) returning id into :newId; end;" ;
CallableStatement cs = (OracleCallableStatement) conn.prepareCall(q);
cs.registerOutParameter("newId", OracleTypes.NUMBER);
cs.execute();
int newId = cs.getInt("newId");

2 个答案:

答案 0 :(得分:1)

JDBC不支持命名绑定,因此它在此处停止。

要么使用索引占位符?,要么在JDBC之上添加额外的抽象层,以支持命名参数,例如: Hibernate和/或JPA


另见:

答案 1 :(得分:0)

更新:以下内容仅用于文档目的,但不是真正可用,因为必须按照sql String中指定的顺序设置命名参数。所以它有效,但非常容易出错。这是:

对于使用oracle jdbc驱动程序版本10的类似星座我有同样的错误,但是在将jdbc驱动程序升级到版本11之后它对我有用。版本12.x也可以。 我的代码看起来像这样:

int nextIdent;
String sql = "call pkg.do_insert(:NEXT_IDENT, :SOME_COL, ...)";
try (CallableStatement stmt = conn.prepareCall(sql)) {
    stmt.registerOutParameter("NEXT_IDENT", Types.INTEGER);
    stmt.setString("SOME_COL", "abc");
    ...
    stmt.execute();
    nextIdent = stmt.getInt("NEXT_IDENT");
}