Oracle&‘s在Java中重新使用(JDBC,预准备语句) [英] Oracle's RETURNING INTO usage in Java (JDBC, Prepared Statement)

查看:0
本文介绍了Oracle&‘s在Java中重新使用(JDBC,预准备语句)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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. 方法#2抛出"不是所有已注册的返回参数",如果我将SQL语句包装到"Begin..end;"中-那么方法#2工作得很好。
    • 为什么方法1在没有"Begin..end"的情况下工作,而方法2需要"Begin..end"才能工作?
    • "Begin..end"对语句做了什么"魔术",使得"不是所有参数都已注册"的问题突然自己解决了?

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

谢谢, 代理

推荐答案

因为与正常输出参数相比,在返回子句中指定的参数的处理方式不同(GetReturnResultSet与GetResultSet与Calcalblestement中的返回参数相比)。
它们需要使用OraclePreparedStatement进行处理。在第二种情况下,当您将INSERT语句包装在Begin..end中时,INSERT由数据库本身处理,并且所有JDBC看到的都是一个匿名的plsql块。
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA

这篇关于Oracle&‘s在Java中重新使用(JDBC,预准备语句)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆