首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询Oracle数据库时出现意外IncorrectResultSizeDataAccessException

查询Oracle数据库时出现意外IncorrectResultSizeDataAccessException
EN

Stack Overflow用户
提问于 2014-12-17 20:11:56
回答 1查看 760关注 0票数 0

我有下面的表格:

代码语言:javascript
复制
  create table INTERNATIONALIZATION (
    ID number not null unique,
    LANG char(2) not null,
    EXT_ID number not null,
    EXT_COLUMN char(32) not null,
    EXT_NAME char(32) not null,
    TRANS_VAL nvarchar2(512) not null
  );

下面的代码旨在从中检索一个且只有一个结果(我100%确定该记录存在)。

代码语言:javascript
复制
public Optional<String> getTranslation(long idSkill, Locale lang, String extColumn, String extName) {
    try {
        return Optional.of(jdbcTemplate.queryForObject("select TRANS_VAL from INTERNATIONALIZATION where ext_id = ? and lang = ? and ext_column = ? and ext_name = ?", String.class, idSkill, lang.toLanguageTag(), extColumn, extName));
    } catch (IncorrectResultSizeDataAccessException ex) {
        return Optional.empty();
    }
}

问题是当我总是在抛出IncorrectResultSizeDataAccessException时得到Optional.empty(),因为没有找到任何记录。

当我在Oracle sql Developer中执行这个SQL查询时,我得到了正确的结果。

导致此问题的原因是什么?它可能与所需列的nvarchar2类型有关吗?

EN

回答 1

Stack Overflow用户

发布于 2014-12-17 22:01:29

您可能需要验证传递给查询的参数。它们可能与您在Oracle SQL Developer中使用的不同。

对于调试,当您捕获异常时,打印所使用的值。

代码语言:javascript
复制
    try {
            return Optional.of(jdbcTemplate.queryForObject("select TRANS_VAL from INTERNATIONALIZATION where ext_id = ? and lang = ? and ext_column = ? and ext_name = ?", String.class, idSkill, lang.toLanguageTag(), extColumn, extName));
        } catch (IncorrectResultSizeDataAccessException ex) {
            return Optional.empty();
          // print idSkill, lang.toLanguageTag(), extColumn, extName here
        }

此外,当您使用CHAR列时,您必须注意比较时填充的空格。由于您正在使用绑定变量,因此在比较字符和varchars时可能会出现问题。

已创建测试表:

代码语言:javascript
复制
     SQL> create table t1 (c1 char(5));
代码语言:javascript
复制
    Table created.

    SQL> insert into t1 values ('A');

    1 row created.

    SQL> commit;

    Commit complete.

与字面量相比,没有问题:

代码语言:javascript
复制
    SQL> select count(*) from t1 where c1 = 'A'; 

      COUNT(*)
    ----------
         1

    SQL> select count(*) from t1 where c1 = 'A ';

      COUNT(*)
    ----------
         1

因为c1是一个char列,所以数据被填充到左边:

代码语言:javascript
复制
    SQL> select '<'|| c1 || '>' from t1;

    '<'||C1
    -------
    <A    >

与varchar2绑定变量进行比较时

代码语言:javascript
复制
    SQL> var s varchar2(5)
    SQL> exec :s := 'A' ;

    PL/SQL procedure successfully completed.

    SQL> select count(*) from t1 where c1 = :s;

      COUNT(*)
    ----------
         0

数据必须相等(5个字符-一个字母,4个空格):

代码语言:javascript
复制
    SQL> exec :s :='A    '

    PL/SQL procedure successfully completed.

    SQL> select count(*) from t1 where c1 = :s;

      COUNT(*)
    ----------
         1

这只是一个技巧,但我认为您最好使用varchar2列:

代码语言:javascript
复制
      create table INTERNATIONALIZATION (
        ID number not null unique,
        LANG varchar2(2) not null,
        EXT_ID number not null,
        EXT_COLUMN varchar2(32) not null,
        EXT_NAME varchar2(32) not null,
        TRANS_VAL nvarchar2(512) not null
      );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27525356

复制
相关文章

相似问题

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