Oracle's RETURN INTO 在 Java 中的使用(JDBC,预准备语句)
2022-09-02 04:45:06
我正在使用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));
问题:
- 方法#2抛出“SQLException:并非所有返回参数都已注册”,但是,如果我将SQL语句包装成“BEGIN..结束;”- 然后方法#2工作得很好。
- 为什么方法#1在没有“BEGIN..”的情况下工作。END“,但方法 #2 需要”BEGIN.。结束“工作?
- 什么样的“魔术”“开始..END“对语句做了让”不是所有参数都注册“的问题突然自行解决?
- 有没有第三种更好的方法来做上述事情?
谢谢你,AG。