java - Oracle 在 Java 中的 RETURNING INTO 用法(JDBC,Prepared Statement)

标签 java oracle jdbc plsql 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));
    

问题:

  1. 如果我将 SQL 语句包装成“BEGIN..END;"- 然后方法 #2 工作得很好。
    • 为什么方法 #1 可以在没有“BEGIN..END”的情况下工作,但方法 #2 需要“BEGIN..END”才能工作?
    • BEGIN..END”对语句做了什么样的“魔法”,使“不是所有参数都注册”的问题突然解决了?

  2. 是否有第三种更好的方法来完成上述操作?

谢谢你, AG。

最佳答案

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

关于java - Oracle 在 Java 中的 RETURNING INTO 用法(JDBC,Prepared Statement),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17320205/

相关文章:

java - Tomcat MySQL 连接数据源不工作

java - 如何将 bytea 转换为 joda.time.DateTime 或时间戳?

java - 如何创建假数据和数据对象以进行单元测试?

sql - 在 Oracle 中对日期使用 trunc 函数的原因

java - JavaFX2 最终会取代 Swing 吗?

javascript - Oracle 9i - 将 Varchar2 转换为 javascript 转义的 UTF-8?

java - java.sql.Connection.close() 对 java.sql.Statement 对象等的影响

Java 游程长度编码

java - For 循环在 Groovy 和 Java 中的工作方式不同

java - 使用方法在数组中搜索唯一名称