gpt4 book ai didi

java - Jaybird CallableStatement 在获取输出参数之前不执行

转载 作者:行者123 更新时间:2023-11-29 08:59:59 31 4
gpt4 key购买 nike

我有这个 Java 代码:

Connection conn = connectionProvider.getConnection();
statement = conn.prepareCall("execute procedure rm_set_coordinates(?,?,?)");
statement.setInt(1, userId);
statement.setString(2, String.valueOf(location.getLatitude()));
statement.setString(3, String.valueOf(location.getLongitude()));
statement.execute();

其中rm_set_coordinatesFirebird存储过程:

create or alter procedure RM_SET_COORDINATES (
PCAR_LOGIN integer,
PLAT varchar(20) = 0,
PLNG varchar(20) = 0)
returns (
ORESULT integer,
ORESULT_MSG varchar(500))
as
begin
update ref_car rc set rc.rm_last_connect_time='now',rc.rm_lat=:plat,rc.rm_lng=:PLNG where rc.id=:pcar_login;
oresult=1;
oresult_msg='';
suspend;
end

当我执行这段代码时,ref_car 表中的数据没有改变。但是如果我将这一行添加到上面的代码中:

statement.getInt(1);

返回 oresult 输出参数的值然后就可以了,ref_car 表中的数据已更新。

最佳答案

问题是您在存储过程中使用了SUSPEND。关键字 SUSPEND 用于可选择的存储过程(产生多行数据的存储过程)。由于您的存储过程只生成一行,因此 SUSPEND 是不必要的(也是原因)。

对于可选择的过程,Jaybird 将您的执行过程 rm_set_coordinates(?,?,?) 转换为 SELECT * FROM rm_set_coordinates(?,?,?)。我不是 100% 确定 Firebird 存储过程的实现细节,但它看起来像一个包含 SUSPEND 的 block 要么只在实际获取行时执行,要么所有更改到前一个 SUSPEND 在语句关闭或重新使用之前未提取行时恢复。

然而,最终结果是:没有获取任何行,也没有任何更改。当执行可选择的存储过程时(即:它包含一个 SUSPEND),Jaybird 检索结果的方式不同于它是“正常”可执行存储过程时的方式。

已知可执行存储过程只有一行(或没有行)结果,因此在执行时会立即检索这些值,并且可以使用 getXXX() 方法检索结果.对于可选择的存储过程,结果的检索方式与普通 ResultSet 类似。通常对于可选择的存储过程,您应该使用 executeQuery() 并处理返回的 ResultSet。由于实现人工制品和与旧版本 Firebird 的兼容性(无法区分可选择和可执行过程),可以检索 ResultSet 的第一行(或当前行)的值> 同时使用 CallableStatementgetXXX() 方法。

TL;DR:移除SUSPEND

披露:我是 Jaybird 的开发者之一

关于java - Jaybird CallableStatement 在获取输出参数之前不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18046737/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com