2014-04-16 272 views
1

您好,我試圖做一個QueryForInt使用春季jbdc.The查詢返回一個簡單的count.On執行我得到springframework.jdbc.UncategorizedSQLException:java.sql.SQLException:無效的列類型。 我沒有找到類似的職位,並嘗試了建議,但我仍然堅持:(... 任何幫助表示讚賞springframework.jdbc.UncategorizedSQLException:無效列類型 -

MapSqlParameterSource params = new MapSqlParameterSource(); 
    params.addValue(DAOConstants.PROD_ID, custVo.getProdId(),OracleTypes.NUMBER); 
    params.addValue(DAOConstants.REQ_IND, DAOConstants.FLAG_Y,OracleTypes.VARCHAR); 

查詢:

select count(1) from prod where prod_id = :PROD_ID and req_ind =:REQ_IND 

表定義

Name    Null  Type   
    ----------------- -------- ------------ 
    PROD_ID   NOT NULL NUMBER(5)   
    REQ_IND     VARCHAR2(10) 

The Logs ..

Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; 
uncategorized SQLException for SQL [select count(1) from prod where prod_id = :PROD_ID and req_ind = :REQ_IND ]; SQL state [99999]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:673) 
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:728) 
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:744) 
    at org.springframework.jdbc.core.JdbcTemplate.queryForInt(JdbcTemplate.java:775) 
    ... 45 more 
Caused by: java.sql.SQLException: Invalid column type 
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) 
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:7937) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7517) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8174) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:8155) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:230) 
    at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.setObject(WrappedPreparedStatement.java:724) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:351) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:216) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:144) 
    at org.springframework.jdbc.core.ArgPreparedStatementSetter.doSetValue(ArgPreparedStatementSetter.java:65) 
    at org.springframework.jdbc.core.ArgPreparedStatementSetter.setValues(ArgPreparedStatementSetter.java:46) 
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:641) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586) 
    ... 56 more 
+0

您將要放入MapSqlParameterSource的參數的類型是什麼? – geoand

+0

@geoand ...感謝我一次測試一個參數的答覆,並發現參數「:PROD_ID」發生異常。在MapSqlParameterSource我插入類型int爲:PROD_ID..cudnt找出原因。 – Ravi

+0

也許int對於數據庫來說太大了。我看到它的類型是NUMBER(5),這意味着它只能容納5位數字 – geoand

回答

3

基於堆棧跟蹤,它看起來像您正在使用JdbcTemplate類。由於您正在使用命名參數樣式佔位符併爲參數提供MapSqlParameterSource,因此您需要使用NamedParameterJdbcTemplate。

那麼,爲什麼你得到這個奇怪的錯誤信息?那麼,您的SQL查詢實際上使用Oracle JDBC驅動程序。它確實允許你使用「?」或使用「:」作爲佔位符的前綴的命名參數樣式。您仍然需要按照您的案例中MapSqlParameterSource不正確的順序提供參數值。可以通過使用對象數組測試此代替喜歡:

new Object[] {custVo.getProdId(), DAOConstants.FLAG_Y} 

該錯誤是基於錯誤的順序來從params.getValues()方法,與字符串值被傳遞在用於的值: PROD_ID。

+0

你是否建議地圖SQL參數中的參數順序應該與它們在查詢中引用的順序相匹配? – Ravi

+0

僅當您不使用NamedParameterJdbcTemplate支持命名佔位符時。如果使用普通的JdbcTemplate,則參數順序必須與佔位符的順序相匹配。 –