没有结果集对象时获得受影响的行数

时间:2018-02-14 11:12:28

标签: java jdbc plsql

我已经给出了一个pl / sql过程,我应该通过jdbc从java代码调用。

public boolean deleteCompany(TimeStamp timestamp, Long companyId){
String str = "{call Delete_Company(?,?)}";
        CallableStatement statement =  null; 
        boolean deleted = false;
        try{
            statement = conn.prepareCall(str);
            statement.setLong(1,companyId);
            statement.setTimestamp(2,timeStamp);
            statement.execute();
            deleted = true;
            return deleted;
        }finally{
            statement.close();
        }  
}

问题是,即使我发送错误的ID号,它显然执行语句,因此可变删除变为真。我尝试.executeUpdate()方法能够获得受影响的行计数,但它无法正常工作,因为在两种情况下(当删除/没有删除时)它检索到1.我想问题是pl / sql程序我是使用只执行删除操作但不检索任何结果集对象。所以executeUpdate()和getUpdateCount()方法都没有帮助我。我的问题是,即使我没有结果集对象,我有什么方法可以获得受影响的行数?

仅供参考:我理解受影响的行数可以作为pl / sql过程中的out参数发送,但我没有权限在db端进行任何更改。

2 个答案:

答案 0 :(得分:0)

由于您无法更改存储过程,因此一种解决方案是执行以下操作

  1. 在调用更新操作(select count(*) from your_tbl where .....)
  2. 之前获取行数
  3. 删除您正在执行的记录
  4. 获取删除操作后的行数,并检查受影响的行数是否与#1中的相同(num_rows#1 - num_rows#3)
  5. 其他交易仍然可以使这种方法有些不可靠,因为它们也可以在步骤#1和#3之间更改您的表格。 如果您担心这一点,那么您应该使用事务(只需将Java代码放在事务中)。

答案 1 :(得分:-2)

你的statement.execute();返回一个布尔值,如果执行成功,它总是返回true,无论程序在调用时做什么。此外,您可以参考以下代码了解您的目标。

...

    boolean hadResults = cStmt.execute();

    //
    // Process all returned result sets
    //

    while (hadResults) {
        ResultSet rs = cStmt.getResultSet();

        // process result set
        ...

        hadResults = cStmt.getMoreResults();
    }

    //
    // Retrieve output parameters
    //
    // Connector/J supports both index-based and
    // name-based retrieval
    //

    int outputValue = cStmt.getInt(2); // index-based

    outputValue = cStmt.getInt("inOutParam"); // name-based

...