我已经给出了一个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端进行任何更改。
答案 0 :(得分:0)
由于您无法更改存储过程,因此一种解决方案是执行以下操作
select count(*) from your_tbl where .....)
其他交易仍然可以使这种方法有些不可靠,因为它们也可以在步骤#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
...