Oracle的RETURNING INTO在Java中的使用(JDBC,Prepared Statement)

我使用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..END;” – 然后方法#2工作正常.

>为什么方法#1没有“BEGIN..END”,但方法#2需要“BEGIN..END”才能正常工作?
>什么样的“魔法”“BEGIN..END”对声明做出了“不是所有参数注册”的问题突然解决了?

>有没有第三,更好的做上述方法

谢谢,
AG.

因为返回子句中指定的参数与正常输出参数(getReturnResultSet vs getResultSet vs在调用存储中返回参数)不同的方式处理.
他们需要使用OraclePreparedStatement处理.在第二种情况下,当您将begin语句中的insert语句打包时,insert由数据库本身处理,并且jdbc看到的是一个匿名的plsql块.
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA

相关文章

Java Oracle 结果集是Java语言中处理数据库查询结果的一种方...
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密...
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台...
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的...
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常...
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上...