2016-07-26 3 views
0

SimpleJdbcCallに問題があります。数値列にはnull値があり、ストアドプロシージャを使用してクエリを実行しようとすると、NumberFormatExceptionが発生します。JavaでSimpleJdbcCallを使用してnull数値を読み取る方法、Spring?

私はこのような構造を持つテーブルを持っている:

USER_ID LOGIN  PASSWORD  NAME   RATING 
---------------------------------------------------------------- 
1   TestLogin TestPassword TestName  null 

これは私の手順です:

create or replace procedure get_user_by_login 

           (p_login in number, 
           p_password out varchar2, 
           p_name out varchar2, 
           p_rating out number) 
    as 

    begin 

    select password, name, rating 
     into p_password, p_name, p_rating 
     from users_test 
     where login = p_login; 

    end; 
/
私は照会しようとしている1つのレコードが

COLUMN_NAME  DATA_TYPE 
----------------------------- 
USER_ID  NUMBER 
LOGIN   VARCHAR2(30 CHAR) 
PASSWORD  VARCHAR2(60 BYTE) 
NAME   VARCHAR2(30 CHAR) 
RATING   NUMBER(1,1) 

あり

これは私のコードです:

public class Main 
{ 

    public static void main(String[] args) { 
     User user = getUserByLogin("TestLogin"); 

     System.out.println(user); 
    } 



    static User getUserByLogin(String login) 
    { 
     SimpleJdbcCall   call = new SimpleJdbcCall(getDataSource()); 
           call.withProcedureName("get_user_by_login"); 

     MapSqlParameterSource in = new MapSqlParameterSource(); 
           in.addValue("p_login", login); 

     call.declareParameters(new SqlOutParameter("p_password", Types.VARCHAR), 
           new SqlOutParameter("p_name", Types.VARCHAR), 
           new SqlOutParameter("p_rating", Types.NUMERIC)); 

     Map<String, Object> out = call.execute(in); 

     User user = new User(); 
     user.setLogin(login); 
     user.setPassword((String) out.get("p_password")); 
     user.setName((String) out.get("p_name")); 
     user.setRating((BigDecimal) out.get("p_rating")); 

     return user; 
    } 

    static DataSource getDataSource() { 
     PoolProperties poolProps = new PoolProperties(); 
     poolProps.setUrl("jdbc:oracle:thin:@localhost:1521:testDB"); 
     poolProps.setDriverClassName("oracle.jdbc.OracleDriver"); 
     poolProps.setUsername("TestUser"); 
     poolProps.setPassword("test"); 
     poolProps.setInitialSize(5); 
     poolProps.setMaxActive(10); 

     DataSource dataSource = new DataSource(); 
     dataSource.setPoolProperties(poolProps); 

     return dataSource; 
    } 

} 

これは私が取得してい例外です:

Exception in thread "main" java.lang.NumberFormatException 
    at java.math.BigDecimal.<init>(BigDecimal.java:494) 
    at java.math.BigDecimal.<init>(BigDecimal.java:383) 
    at java.math.BigDecimal.<init>(BigDecimal.java:806) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:9153) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8954) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9557) 
    at oracle.jdbc.driver.OracleCallableStatement.setObject(OracleCallableStatement.java:6090) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:249) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:364) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:150) 
    at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:213) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1077) 
    at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1135) 
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:405) 
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:365) 
    at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:198) 
    at com.eisima.spring.Main.getUserByLogin(Main.java:39) 
    at com.eisima.spring.Main.main(Main.java:20) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
+0

'RATING'列のDB内のデータが数字ではないようです。 DB内のデータを確認し、番号を確認してください。 –

答えて

0

を、これはそれを行うには最適な方法ではありませんが、まあ、あなたは、例えばのようなこのような状況多くの方法を、近づくことができる:

try { 
    user.setRating((BigDecimal) out.get("p_rating")); 
} catch (NumberFormatException e) { 
    e.printStackTrace(); 
} 

または多分:

if (out.get("p_rating") == null) { 
    user.setRating(new BigDecimal(0)); 
} 

しかし、あなたは、あなたが期待するべきでNULL値を入れしようとしている場合NumberFormatException。上記の2つのうちの1つが問題を解決しますが、ユースケースを分析して、実際に何が最良のものかを確認する必要があります。

+0

スタックトレースは、評価を得るときではなく、JDBCドライバ内部で発生します。 –

+0

'RATING'は、OPが' RATING NUMBER(1,1) 'と言っている数字です。 – Julian

0

理由は、間違った手続き宣言でました:

create or replace procedure get_user_by_login 

-- i'm passing string there ---> (p_login in number, 
            p_password out varchar2, 
            p_name out varchar2, 
            p_rating out number) 
     as 

     begin 

     select password, name, rating 
      into p_password, p_name, p_rating 
      from users 
      where login = p_login; 

     end; 
    /

私はBigDecimalのにnullを変換する際にエラーが考えていたが、null値を持つすべてのエラーは全くありませんでした。プロシージャ・コールは、期待どおりにcolumnの値がnullの場合にnull値を返します。

誰もが助けてくれてありがとう。

関連する問題