我使用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
>使用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
他们需要使用OraclePreparedStatement处理.在第二种情况下,当您将begin语句中的insert语句打包时,insert由数据库本身处理,并且jdbc看到的是一个匿名的plsql块.
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA
原文地址:https://www.jb51.cc/oracle/205567.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。