Oracle在Java中的RETURNING INTO用法(JDBC、Prepared Statement)

2024-02-28

我正在使用 JDBC 执行 Oracle 语句,如下所示:

"INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?"
// MYTABLE's def makes MY_CALCULATED_DATA be auto-generated by DB on insert

我找到了Java中调用上面语句的几种方法,主要是:

  • 使用 OraclePreparedStatement:

    ps = (OraclePreparedStatement)conn.prepareStatement(sql);
    ps.setString(1, "myvalue");
    ps.registerReturnParameter(2, Types.VARCHAR);
    ps.execute();
    rs = ps.getReturnResultSet();
    rs.next();
    System.out.print(rs.getString(1));
    
  • 使用 CallableStatement:

    cs = conn.prepareCall(sql);
    cs.setString(1, "myvalue");
    cs.registerOutParameter(2, Types.VARCHAR);
    cs.execute();
    System.out.print(cs.getString(1));
    

问题:

  1. Method #2 throws "SQLException: Not all return parameters registered", BUT, if I wrap the SQL statement into "BEGIN..END;" - then method #2 works just fine.
    • 为什么方法 #1 可以在没有“开始..结束“但是方法#2需要”开始..结束“ 上班?
    • What kind of "magic" "BEGIN..END" does to the statement so that "not all parameters registered" problem suddenly solves itself?
  2. 是否有第三种更好的方法来执行上述操作?

谢谢你, 股份公司。


因为与普通输出参数相比,返回子句中指定的参数的处理方式不同(getReturnResultSet 与 getResultSet 与 callablestatement 中的返回参数)。
它们需要使用 OraclePreparedStatement 进行处理。在第二种情况下,当您将 insert 语句包装在 begin..end 中时,插入由数据库本身处理,并且 al jdbc 看到的是匿名 plsql 块。
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle在Java中的RETURNING INTO用法(JDBC、Prepared Statement) 的相关文章

随机推荐