首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在获得输出参数之前,Jaybird CallableStatement不会执行

在获得输出参数之前,Jaybird CallableStatement不会执行
EN

Stack Overflow用户
提问于 2013-08-04 19:26:58
回答 1查看 1.1K关注 0票数 2

我有一个Java代码:

代码语言:javascript
复制
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存储过程:

代码语言:javascript
复制
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表中的数据不会更改。但是如果我将这一行添加到上面的代码中:

代码语言:javascript
复制
statement.getInt(1);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-05 07:40:26

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

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

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

已知,可执行存储过程只有一行(或没有行)结果,因此在执行时立即检索这些值,并且可以使用getXXX()方法检索结果。对于可选择的存储过程,结果会像普通的ResultSet一样被检索。通常,对于可选择的存储过程,您应该使用executeQuery()并处理返回的ResultSet。由于实现伪值以及与旧版本的Firebird的兼容性(其中无法区分可选过程和可执行过程),因此也可以使用ResultSetgetXXX()方法检索CallableStatement的第一行(或当前行)的值。

TL;博士:移除SUSPEND

:我是Jaybird的开发人员之一

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18046737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档