2011-09-20 3 views
1

, 나는 자바 디코드 기능을 작성했습니다. 그것은 코드와 함께 작동 :H2 오라클 디코드 기능

public final static Value decode(Value expression, Value ... paramValues) { 
    boolean param = true; 
    boolean hit = false; 
    Value returnValue = null; 
    Value defaultValue = null; 
    // Walk through all parameters, alternately the 'param' and corresponding 'value'. 
    // If 'param' is equal the expression, then return the next 'value'. 
    // If no hit, the return the last 'param' value as default value. 
    for (Value str : paramValues) { 
     if (param) { 
      defaultValue = str; // In case this is the last parameter. 
      // Remember the hit. The next value will be returned. 
      hit = (MiscUtil.equals(expression, str)); 
     } else { 
      if (hit) { 
      returnValue = str; 
      break; // return str; 
      } 
      defaultValue = null; 
     } 
     param = ! param; 
    } 
    return (returnValue==null) ? defaultValue : returnValue; 
} 

인가 아무것도가 :

org.h2.jdbc.JdbcSQLException: Hexadecimal string with odd number of characters: "6.0"; SQL statement: 
select 6.0 - decode(1.0,2.0,3.0,4.0) from dual ; [90003-157] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:327) 
    at org.h2.message.DbException.get(DbException.java:167) 
    at org.h2.message.DbException.get(DbException.java:144) 
    at org.h2.util.StringUtils.convertHexToBytes(StringUtils.java:943) 
    at org.h2.value.Value.convertTo(Value.java:826) 
    at org.h2.expression.Operation.getValue(Operation.java:108) 
    at org.h2.command.dml.Select.queryFlat(Select.java:518) 
    at org.h2.command.dml.Select.queryWithoutCache(Select.java:617) 
    at org.h2.command.dml.Query.query(Query.java:298) 
    at org.h2.command.dml.Query.query(Query.java:268) 
    at org.h2.command.dml.Query.query(Query.java:37) 
    at org.h2.command.CommandContainer.query(CommandContainer.java:80) 
    at org.h2.command.Command.executeQuery(Command.java:181) 
    at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:96) 

내 디코드 기능은 그대로 :

String sql = "select decode(1.0,2.0,3.0,4.0) from dual ;"; 
PreparedStatement stmt = connection.prepareStatement(sql); 
ResultSet resultSet = (ResultSet) stmt.executeQuery(); 

그러나 코드

String sql = "select 6.0 - decode(1.0,2.0,3.0,4.0) from dual ;"; 

오류를 제공합니다 내 디코드 기능에 문제가 있습니까?


나는 디코드 기능을 대신 값의 객체를 반환했는데, 마지막에이 코드를 추가 한 :

Object returnObject=null; 
if (returnValue instanceof ValueDecimal) { 
    returnObject = ((ValueDecimal)returnValue).getBigDecimal(); 
} else if (returnValue instanceof ValueString) { 
    returnObject = ((ValueString)returnValue).getString(); 
} else if (returnValue instanceof ValueDate) { 
    returnObject = ((ValueDate)returnValue).getDate(); 
} 
return returnValue; 

하지만 내가 가지고 :

org.h2.jdbc.JdbcSQLException: Data conversion error converting "aced0005737200146a6176612e6d6174682e426967446563696d616c54c71557f981284f0300024900057363616c654c0006696e7456616c7400164c6a6176612f6d6174682f426967496e74656765723b787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b020000787000000001737200146a6176612e6d6174682e426967496e74656765728cfc9f1fa93bfb1d030006490008626974436f756e744900096269744c656e67746849001366697273744e6f6e7a65726f427974654e756d49000c6c6f776573745365744269744900067369676e756d5b00096d61676e69747564657400025b427871007e0002fffffffffffffffffffffffefffffffe00000001757200025b42acf317f8060854e0020000787000000001287878"; SQL statement: 
select 6.0 - cast(decode(1.0,2.0,3.0,4.0) as double) xxx from dual ; [22018-157] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:327) 
    at org.h2.message.DbException.get(DbException.java:156) 
    at org.h2.value.Value.convertTo(Value.java:855) 
    at org.h2.expression.Function.getSimpleValue(Function.java:733) 
    at org.h2.expression.Function.getValueWithArgs(Function.java:893) 
    at org.h2.expression.Function.getValue(Function.java:432) 
    at org.h2.expression.Operation.getValue(Operation.java:113) 
    at org.h2.expression.Alias.getValue(Alias.java:35) 
... 

또한 행운을 불렀던 ValueExpression으로 시도해 보았습니다. H2의 디코딩을위한

전체 지원 최적의 솔루션이 될 것입니다. 그게 토마스 한테 줄 수있는거야?

+0

무엇 [WHEN' 대신 proprietery'의'CASE를 DECODE'] [1]? [1] : http://stackoverflow.com/questions/1559241/decode-function-in-sql-server –

답변

2

H2 데이터 유형 JAVA_OBJECT하다고 생각되므로 첫 번째 바이트 배열 변환 수단 JAVA_OBJECT에 파라미터 (6.0 디코드 결과)를 변환하기 원한다. 이것은 실패합니다.

내가 직접 테스트하지 못했지만, 명시 적 CAST 작동합니다 :

select 6.0 - cast(decode(1.0,2.0,3.0,4.0) as double) from dual 

그것은 조금 추한 나도 알아. 표준 SQL 사용에 대한

+0

제안 사항은 동일한 예외를 준다. 디코드에서 '6.0 -'을 움직이면 정상적으로 작동합니다. 듀얼에서 디코드 (1.0, 2.0, 6.0-3.0, 6.0-4.0)를 선택하십시오. 그러나 많은 뷰 및 SQL 호출에서 이와 같은 구성을 많이 사용합니다. 그래서이 모든 것을 찾아서 바꾸는 것은 나쁜 해결책입니다. '6.0 - decode (...'?)를 처리하는 DECODE 함수를 코딩하는 방법이 있습니까? – SvRekaa

+0

실례합니다. 제안은 작동하지만, 여전히 코드 변경을 피하기 위해 다른 솔루션을 원합니다. – SvRekaa

+0

가능한 한 가지 해결책 H2 데이터베이스 자체에 decode''에 대한 지원을 추가하는 것입니다. 또 다른 해결책은 아직 기능을 실행하지 않고, 함수 내에서 데이터 형식을 계산하는 방법을 제공하는 것이다. 그 자체가 원인 것 H2의 디코딩을위한 –