1.想法 在調用存儲過程時候,如果出現出錯,應該在頁面彈出異常提示信息,快速定位錯誤原因,也應該在存儲過程和函數過程中盡可能的捕獲概率發生較大的異常情況,並且在客戶端頁面通知(如果發生的話)
首先百度了,借鑒了下面這種方案 www.linuxidc.com
自定義Oracle拋出異常解決
Caused by: java.sql.SQLException: ORA-02291: 違反完整約束條件 (xxx.FK_yyyy) - 未找到父項關鍵字
如何自定義oracle 拋出的異常?
使用RAISE_APPLICATION_ERROR 函數
該函數是將應用程序專有的錯誤從服務器端轉達到客戶端應用程序(其他機器上的SQLPLUS或者前台開發語言)
如何使用
RAISE_APPLICATION_ERROR( error_num IN NUMBER, error_msg IN VARCHAR2);
error_num :錯誤碼,-20000到-20999 之間,這樣就不會與ORACLE已有的的錯誤代碼發生沖突。
error_msg :錯誤信息, 的長度不能超過 2k,否則截取 2k。
我的做法
1.函數寫法如下
create or replace function GET_PERFORMANCE_COEFFICIENT(PERFORMANCE_SCORE number) return
number is --獲取績效系數
coefficient number(10,2);
maxScore number(10,2);
begin
select max(hign_score) into maxScore from PERFORMANCE_RULE;
select p.coefficient into coefficient from PERFORMANCE_RULE p
where
(PERFORMANCE_SCORE<p.hign_score and PERFORMANCE_SCORE>=p.lower_score)
or (PERFORMANCE_SCORE = maxScore and p.hign_score = maxScore)
;
return coefficient;
exception
when no_data_found then
RAISE_APPLICATION_ERROR(-20002, '未找到績效系數');
end;
上面的做法就可以讓我們的JAVA程序捕獲到異常了
2.JAVA端
throws SQLException
public void executeSpGenerateSalary(int year,int month,Double holidayBase) throws SQLException {
String sql="{ CALL sp_generate_salary(?,?,?) }";
Connection conn = getSession().connection();
CallableStatement cs = conn.prepareCall(sql);
cs.setInt(1, year);
cs.setInt(2, month);
cs.setDouble(3, holidayBase);
cs.execute();
cs.close();
}
然後在controller捕獲
@RequestMapping("/generateSalary")
@ResponseBody
public Map<String,Object> generateSalary(SalaryEntity salaryEntity){
Map<String,Object> mapResult = new HashMap<String,Object>();
try{
salaryService.generateSalary(salaryEntity);
mapResult.put("result", true);
}
catch(java.sql.SQLException e){
mapResult.put("result", false);
mapResult.put("message", e.getMessage());
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
mapResult.put("result", false);
mapResult.put("message", e.getMessage());
}
return mapResult;
}