1

我对 JDBC executeUpdate() 方法有疑问。无论是否更新一行,它总是返回 1。据我了解,它应该返回 0 的方法是没有更改任何行。

这是我的代码示例:

try {
conn = pool.getConnection();
        PreparedStatement ps = conn.prepareStatement("{CALL UPDATE_USER (?,?,?)}");
        ps.setString(1, field.toString());
        ps.setString(2, change);
        ps.setString(3, userID);
        int updated = ps.executeUpdate();
        System.out.println(updated);
        if(updated==0){
            throw new NoUserException();
        }
        ps.close();
    } catch (SQLException e) {
        log.error("An error occurred while creating the connection");
        e.printStackTrace();
    } finally {
        pool.returnConnection(conn);
    }

这可能是因为我使用的是准备好的语句或存储过程吗?

这是存储过程:

create or replace
PROCEDURE UPDATE_USER
(
  updateColumn IN user_tab_columns.column_name%type,
  changeStr IN VARCHAR2,
  unID IN VARCHAR2
)
IS
BEGIN
  EXECUTE IMMEDIATE
    'UPDATE
      users
SET ' || updateColumn || '= :1
WHERE
  uniqueID = :2'
  USING changeStr, unID; 
END;
4

2 回答 2

2

它无法从存储的过程执行中获取信息。如果您想获取行数(或其他任何内容),请将 PROCEDURE 切换到 FUNCTION,在此函数中添加 return 子句,并将您的调用更改为类似 ? = CALL ... 使用函数内部的 sql%rowcount 进行测试以获得受影响的行数。

于 2012-12-20T13:10:57.197 回答
0

你可以使用Callable 声明一个过程或函数。并将受影响的行数作为返回参数返回

于 2012-12-20T13:23:54.290 回答