关于存储过程和函数异常出现和JAVA捕获简单处理方案

1.想法 在调用存储过程时候,如果出现出错,应该在页面弹出异常提示信息,快速定位错误原因,

也应该在存储过程和函数过程中尽可能的捕获概率发生较大的异常情况,并且在客户端页面通知(如果发生的话)

首先百度了,借鉴了下面这种方案

自定义oracle抛出异常解决

 

Caused by: java.sql.SQLException: ORA-02291: 违反完整约束条件 (xxx.FK_yyyy) - 未找到父项关键字  www.2cto.com  
 
如何自定义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;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值