【问题标题】:Change datatype of a sequence H2DB更改序列 H2DB 的数据类型
【发布时间】:2015-08-03 01:32:10
【问题描述】:

我需要更改存储到 H2DB 中的序列的返回值,当我通过直接 SQL 查询调用 nextVal 时,H2 返回一个 BigInt,我需要一个 BigDecimal。

我无法转换或转换此值,我需要 H2 返回 BigDecimal。

我该怎么做?

编辑:我无法更改 Java 代码,因为我正在测试所以转换或转换来自 DB 的请求值不是一个选项。

【问题讨论】:

  • 我也对这个问题感兴趣。我会继续自己研究,但我希望这个问题得到更多关注。

标签: java oracle h2


【解决方案1】:

如果允许替换 H2 jar 文件,您可以创建自己的 H2 补丁版本。

org.h2.expression.Function

    addFunctionNotDeterministic("NEXTVAL", NEXTVAL,
            VAR_ARGS, Value.LONG); 

    addFunctionNotDeterministic("NEXTVAL", NEXTVAL,
            VAR_ARGS, Value.DECIMAL);

并在org.h2.expression.SequenceValue 更改

@Override
public Value getValue(Session session) {
    long value = sequence.getNext(session);
    session.setLastIdentity(ValueLong.get(value));
    return ValueLong.get(value);
}

@Override
public int getType() {
    return Value.LONG;
} 

@Override
public Value getValue(Session session) {
    long lv = sequence.getNext(session);
    ValueDecimal value = ValueDecimal.get(BigDecimal.valueOf(lv)); 
    session.setLastIdentity(value);
    return value;
}

@Override
public int getType() {
    return Value.DECIMAL;
} 

【讨论】:

  • 没有对此进行测试,但代码更改似乎很直接。
  • 有趣,我将不得不测试并回复你。到目前为止,这似乎是我见过的最好的方法。
【解决方案2】:

我试图从wero 的答案中获取代码,并将其变成 H2 本身的一个功能。

此 GitHub 分支:https://github.com/portofrotterdam/h2database 在 H2 中使用 'MODE=Oracle' 时返回 BigDecimals 而不是 BigInteger/longs,使其与 Oracle 的数据库更加兼容。

我已经请求拉到主服务器,所以这个行为可能会在 h2database 中可用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2019-04-29
  • 2018-11-22
  • 2021-07-26
相关资源
最近更新 更多