跳到主要内容

存储过程与函数

传入参数与读取返回值

标量值可以通过 IN、OUT、INOUT 参数传递。例如创建一个计算两数之和的存储过程:

CREATE PROCEDURE add_numbers(IN a INT, IN b INT, INOUT result INT)
BEGIN SET result = a + b; END

将完整定义作为一条语句执行。调用时绑定输入值,并声明返回参数:

Map<String, Object> result = jdbc.call(
"CALL add_numbers(?, ?, ?)",
new Object[] { 10, 5, SqlArg.asInOut("result", 0, Types.INTEGER) });
Integer sum = (Integer) result.get("result"); // 15

也支持命名参数、参数类型配置和多个标量返回值。不支持将返回参数配置为 JDBC REF_CURSOR 来映射游标;过程直接返回记录时,使用结果集规则,不要声明 REF_CURSOR 参数。

读取函数值

MySQL 存储函数返回一个标量值,不返回表,也不通过 OUT 参数返回一组字段。使用查询方法读取:

CREATE FUNCTION add_numbers(a INT, b INT)
RETURNS INT DETERMINISTIC RETURN a + b;
Integer sum = jdbc.queryForObject("SELECT add_numbers(?, ?)",
new Object[] { 10, 5 }, Integer.class);

支持位置参数、命名参数、类型转换和 CallableStatement 回调。需要多个返回字段或结果集时,改用存储过程,不要声明表返回函数。