2013-02-20 22 views
1

鑑於以下Oracle SQL存儲過程簽名:「錯誤的數量或類型的參數」,在nativeQuery與時間參數設置爲null

PROCEDURE Update_Desactivation_Date(
    code_util    IN NUMBER, 
    t_no_piste    IN VARCHAR2, 
    date_depart   IN DATE); 

使用下面的代碼從Java JPA2休眠上下文調用:

entityManager.createNativeQuery("CALL Update_Desactivation_Date(
     + ":code_util, " 
     + ":t_no_piste, " 
     + ":date_depart" 
     + ")") 
    .setParameter("code_util", 30320) 
    .setParameter("t_no_piste", "087046") 
    .setParameter("date_depart", null) 
    .executeUpdate(); 

的執行產生了以下異常:

WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 6553, SQLState: 65000 
ERROR: org.hibernate.util.JDBCExceptionReporter - ORA-06553: PLS-306: wrong number or types of arguments in call to 'UPDATE_DESACTIVATION_DATE' 

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1224) 
    at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:108) 
    at com.sw.chuv.badges.backend.dao.ExecuteUpdateInProcedure.main(ExecuteUpdateInProcedure.java:25) 
Caused by: org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:219) 
    at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1310) 
    at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:396) 
    at org.hibernate.ejb.QueryImpl.internalExecuteUpdate(QueryImpl.java:188) 
    at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:99) 
    ... 1 more 
Caused by: java.sql.SQLException: ORA-06553: PLS-306: wrong number or types of arguments in call to 'UPDATE_DESACTIVATION_DATE' 

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) 
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) 
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450) 
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) 
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207) 
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3665) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1352) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:233) 
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:210) 
    ... 5 more 

如何來了,因爲所有參數設置正確?

回答

2

該日期參數的值爲null是罪魁禍首。你必須發送一個空字符串:

entityManager.createNativeQuery("CALL Update_Desactivation_Date(
     + ":code_util, " 
     + ":t_no_piste, " 
     + ":date_depart" 
     + ")") 
    .setParameter("code_util", 30320) 
    .setParameter("t_no_piste", "087046") 
    .setParameter("date_depart", "") 
    .executeUpdate(); 

這個問題似乎與所有時間類型(DATETIMETIMESTAMP

1

的另一種可能性是SQL過程中定義默認參數:

PROCEDURE Update_Desactivation_Date(
     code_util    IN NUMBER, 
     t_no_piste    IN VARCHAR2, 
     date_depart   IN DATE DEFAULT NULL); 
+2

同意,這將是一個漂亮的解決方案,但是這個過程是我們無法修改的遺留數據庫的一部分。 – Mithfindel 2013-02-20 22:34:37

相關問題