当前位置: 首页 > 知识库问答 >
问题:

Oracle在Java的回归(JDBC,准备好的语句)

从阎宝
2023-03-14

我正在使用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:Not all return parameters registered”,但是,如果我将SQL语句包装为“begin..end;”-那么方法2就很好。
    • 为什么方法#1不使用“Begin..End”而方法#2需要“Begin..End”才能工作?
    • “begin..end”对语句有什么“魔力”,使“未注册所有参数”的问题突然自行解决?

      谢谢你,AG。

  • 共有2个答案

    欧阳楚
    2023-03-14

    为了获得自动生成的键,我们在preparestatement中有方法getGeneratedKeys方法,它返回包含键值的resultset,我们只需要将键列名传递给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)); 
        }
    }
    
    金秦斩
    2023-03-14

    因为与普通输出参数(getReturnResultSet vs getResultSet vs callablestatement中的返回参数)相比,返回子句中指定的参数的处理方式不同。
    它们需要用OraclePreparedStatement来处理。在第二种情况下,当您将insert语句包装为BEGIN..END时,insert由数据库本身处理,jdbc看到的只是一个匿名plsql块。
    http://docs.oracle.com/cd/e11882_01/java.112/e16548/oraint.htm#BABJJDDA

     类似资料:
    • 我正在尝试使用准备好的语句和TABLE_CATALOG和table_schema的参数来选择默认模式'public'中的所有表。当我创建一个准备好的语句时,系统会返回一个错误,这没有任何意义。如果我指定了TABLE_CATALOG而不指定TABLE_SCHEMA,它可以很好地工作。另外,如果指定TABLE_SCHEMA而不指定TABLE_CATALOG,它也可以正常工作。我是不是做错什么了? 线程

    • 我正在尝试编写一个查询,并使用java和JDBC从oracle db中获取结果。我的问题是,如果我尝试with statement的话,相同的查询可以工作,但是如果我使用PreparedStatement的话,相同的查询就不工作了。语句代码:(这里我得到的是真实的计数值) 当我sysout时,我的sqlDate打印如下:2015-09-24。 我对其他一些问题也有同样的问题。有人能知道这里出了什么

    • 问题内容: 使用JDBC(Oracle),我需要在两个表的每一个中插入大约一千行。像这样: 问题在于两个表都是通过公共序列连接的,因此语句的顺序很重要。 如果我只有一张桌子,那会很容易。在这种情况下,我使用了代码: 但是,这种方法只能用一个准备好的语句,因此只能用一个插入。我该如何解决这个问题? 问题答案: 你可以试试 然后

    • 我有一个类,其中我使用旧的jdbc方法创建了到h2数据库的连接,该方法编写url并获取连接,我在数据库中创建了一个表,这个表不是java对象,所以我用尽了聪明的方法来为我的方法编写测试 //我还创建了一个表app_user公共void addUser(连接连接,字符串登录,字符串密码,字符串描述)抛出SQLException{ 而我的测试方法看起来像这样,有没有办法让它不那么整洁,更简单,我试图用

    • 我目前正在增强一个使用spring和Hibernate的应用程序。有多个应用程序通过准备好的语句与db(postgres)通信的实例。到目前为止,应用程序通过DBCP与postgres通信。 更改:应用程序现在通过pgbouncer与postgres通信。 即:application->dbcp->pgbouncer->postgres 我知道这不是最理想的解决方案,即:有两个池。但由于当前的体系