首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Oracle在Java中的回归使用(JDBC,预准备语句)

Oracle在Java中的回归使用(JDBC,预准备语句)
EN

Stack Overflow用户
提问于 2013-06-26 20:37:13
回答 2查看 18K关注 0票数 21

我正在使用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));

  • Using CallableStatement:

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

问题:

如果我将语句封装到"BEGIN..END;“中,方法#2抛出"SQLException: Not all return parameters ”,而不是-那么方法#2工作得很好。为什么方法#1没有"BEGIN..END“就可以工作,但是方法#2需要"BEGIN..END”才能工作?

  • 对语句做了什么“魔术”,使得“不是所有参数都注册”的问题突然解决了?

  1. 有没有更好的第三种方法呢?

谢谢,AG。

EN

回答 2

Stack Overflow用户

发布于 2014-02-07 20:10:22

因为与正常的输出参数相比,在returning子句中指定的参数的处理方式不同(getReturnResultSet、getResultSet和callablestatement中的返回参数)。

它们需要用OraclePreparedStatement来处理。在第二种情况下,当您将insert语句包装在begin..end中时,insert由数据库本身处理,并且所有jdbc看到的都是一个匿名的plsql块。

http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA

票数 6
EN

Stack Overflow用户

发布于 2013-12-05 20:57:54

为了获得自动生成的键,我们在preparestatement中有一个方法getGeneratedKeys方法,它返回包含键值的结果集,我们所需要的就是将键列名称传递给preparestatement

pstm = con.prepareStatement("insert query",new String[]{primarykeycolumnname});
int i = pstm.executeUpdate();
if (i > 0) 
{
    ResultSet rs = pstm.getGeneratedKeys();
    while(rs.next())
    {
        System.out.println(rs.getString(1)); 
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17320205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档