2012-09-13 61 views
3

我在Oracle中有一個過程,它有12個總參數和3個可選參數。如果我在Spring 3.1.0中使用StoredProcedure對象,如何解釋這些可選參數?Spring StoredProcedure可選參數

這裏是我迄今爲止在我的StoredProcedure的類

public Map<String, Object> execute(Evaluation evaluation) { 
    Map<String, Object> input_params = new HashMap<String, Object>(); 
    input_params.put(COURSE_MAIN_PK1_INPUT_PARAM, evaluation.getCourseId()); 
    input_params.put(USERS_PK1_INPUT_PARAM, evaluation.getUsersPk1()); 
    input_params.put(ACCREDITATION_PK1_INPUT_PARAM, evaluation.getAccreditationPk1()); 
    input_params.put(TYPE_PK1_INPUT_PARAM, evaluation.getTypePk1()); 
    input_params.put(PRIVACY_TYPE_PK1_INPUT_PARAM, evaluation.getPrivacyTypePk1()); 
    input_params.put(FORM_TYPE_PK1_INPUT_PARAM, evaluation.getFormTypePk1()); 
    input_params.put(TITLE_INPUT_PARAM, evaluation.getTitle()); 
    input_params.put(DESCRIPTION_INPUT_PARAM, evaluation.getDescription()); 

    if(evaluation.getStartDate() != null) { 
     input_params.put(START_DATE_INPUT_PARAM, new java.sql.Date(evaluation.getStartDate().getMillis()));   
    } 

    if(evaluation.getEndDate() != null) { 
     input_params.put(END_DATE_INPUT_PARAM, new java.sql.Date(evaluation.getEndDate().getMillis())); 
    } 

    input_params.put(SAVE_TO_GRADECENTER_INPUT_PARAM, evaluation.getGradeCenterColumn()); 
    input_params.put(CREATE_ANNOUNCEMENT_INPUT_PARAM, evaluation.getAnnouncement()); 

    return super.execute(input_params); 
} 

的問題,這是我提供12個參數,如果開始和結束日期是空的,我現在供應10得到一個例外。

在數據庫中的日期的默認值是null

+0

由於'Map'可以包含'null'值,你有沒有嘗試只需添加的startDate和結束日期鍵地圖總是看到如果存儲過程運行在兩種情況下的日期是空和非空罰款? – Vikdor

+0

是的,當有一個日期,它運行良好,但問題是當'evaluation.getStartDate()。getMillis()'供給'java.sql.Date'構造函數返回一個空的,我得到一個NullPointerException異常' '。因此,如果它爲null,並且讓過程插入默認值(null),那麼我不想提供該參數。 – Robert

+0

我的意思是說,如果'evaluation.getStartDate()== null',然後嘗試'input_params.put(START_DATE_INPUT_PARAM,null)'。同樣對於'evaluation.getEndDate == null'也是如此。 – Vikdor

回答

4

JDBC的PreparedStatement提供了一種工具以設置空值使用setNull方法參數。因此,只要您將所有參數傳遞給存儲過程(如果它們爲null),Spring就可以準備語句並執行它。

所以,你需要添加的輸入參數,其值是零,到被髮送到存儲過程調用的地圖。

input_params.put(START_DATE_INPUT_PARAM, 
       (null != evaluation.getStartDate() 
        ? new java.sql.Date(evaluation.getStartDate().getMillis()) 
        : null)); 

這同樣適用於END_DATE_INPUT_PARAM。