更改序列H2DB

时间:2015-05-21 11:44:38

标签: java oracle h2

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

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

我怎么能这样做?

编辑:我无法更改Java代码,因为我正在测试,因此不能选择从DB转换或转换请求值。

2 个答案:

答案 0 :(得分:3)

如果允许替换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;
} 

答案 1 :(得分:0)

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

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

我已请求拉到主服务器,所以也许此行为将在h2database中可用。