CallableStatement 使用 executeUpdate() 时可能会出现的返回值

AUTHOR | nicechi
类别 | Java
发表 | 2020-09-14 21:58:12
更新 | 2020-09-14 22:03:35

在 JDBC 中,对于 Statement 以及 PreparedStatement 对象来说,executeUpdate() 只能用来执行 DDL 或者 DML 语句,executeUpdate() 的返回值就是执行 DDL 或者 DML 语句时所影响的行数。

但是对于 CallableStatement 对象来说就有点特殊,因为  CallableStatement 对象是用专门用来执行存储过程( stored procedure )的,它在执行 executeUpdate() 的时候,并没有要求说 executeUpdate() 所要执行的 SQL 语句必须得是 DDL 或者 DML 语句, executeUpdate() 也可以用来执行 " CALL xxx() " 语句。所以这个时候 executeUpdate() 的返回值就变得有点奇怪,因为它的返回值不再是执行 DDL 或者 DML 语句时所影响的行数。

下面是我总结的关于 CallableStatement 对象执行 executeUpdate() 时可能会出现的返回值:

  • 如果 CallableStatement 对象所执行的存储过程中包含有 DDL 或者 DML 语句或者 SELECT ... INTO ... 语句,但是没有 SELECT 语句的话,executeUpdate() 的返回值就与最后一个执行的 DDL 或者 DML 语句或者 SELECT ... INTO ... 语句有关
    • 如果最后一个执行的语句是 DDL 与 DML 语句的话, executeUpdate() 的返回值就是这个 DDL 或者 DML 语句的受影响的行数
    • 如果最后一个执行的语句是 SELECT ... INTO ... 语句的话,当 SELECT 有结果的话,返回值就为 1,当 SELECT 没有结果的话,返回值就为 0
  • 只要 CallableStatement 对象所执行的存储过程中存在有一个 SELECT (除了 SELECT ... INTO ...)语句,那么 executeUpdate() 的返回值就是第一个被执行的 SELECT 语句的结果集的行数
    • 还有一个例外,如果此时第一个被执行的 SELECT 语句的结果集只有一行的话, executeUpdate() 的返回值将会是 -1
  • 如果 CallableStatement 对象所执行的存储过程中既没有 DDL 或者 DML 语句,也没有 SELECT … INTO … 语句,也没有 SELECT 语句,则 executeUpdate() 的返回值为 0

 

 

 


CATEGORY

TOP