Daoからストアドを使う

久しぶりにDaoなんぞ書かされた書いた。


in/outのパラメータ受渡しは面倒なのでVoにまとめる。

 public HogeVo doHogePro(HogeVo inVo){
  //戻り用Vo
  HogeVo outVo = new HogeVo();
  outVo.clear();

  CallableStatement cstmt = null;
  String sql = "CALL HogePack.HogePro(?,?,?,?)";

  try{
   //In
   cstmt = con.prepareCall(sql);
   cstmt.setString(1,inVo.getStr());
   cstmt.setTimestamp(2,inVo.getDate());
   cstmt.setLong(3,inVo.getNo());

   //Out
   cstmt.registerOutParameter(4,java.sql.Types.NUMERIC);

   //実行
   cstmt.execute();  //executeUpdate()でもよい

   //戻り値の取得
   outVo.setRet(cstmt.getInt(4));

   cstmt.close();
  }catch(Exception e){
   cat.error("doHogePro:" + e);
   if (cstmt != null) {
    try {
     cstmt.close();
    } catch (SQLException se) {}
   }
   outVo.setRet(getRET_ERROR());
  }
  return outVo;
 }


java.sql.Types.NUMERICはなんだかBIGINTとかいろいろあるけど、NUMBERに関してはこれで動くようだ。
プロシージャからの戻りをどう判定するかを悩んだけれど、Dao内にprivate final staticで定義した。
変数をどこかでまとめてもいいけれど、このクラスでしか使用しないのならば共通化する意味はあまりないしね。

 private final static int RET_NORMAL = 0;   //正常終了
 private final static int RET_WARNING = 100;  //警告
 private final static int RET_ERROR = 255;   //異常終了

 public static int getRET_NORMAL() {
  return RET_NORMAL;
 }
 public static int getRET_WARNING() {
  return RET_WARNING;
 }
 public static int getRET_ERROR() {
  return RET_ERROR;
 }


staicに対してgetterは使うのかな?、と自問自答。


呼び出した側で結果を判定する。

//パラメータを設定する
HogeVo InVo = new HogeVo();
InVo.setCode("CODE");
InVo.setDate(new Timestamp(12345));
InVo.setNo(33345);

//処理実行
HogeVo outVo = hogeDao.doHogePro(InVo);

//結果判定
//正常処理(commit()など)
if(outVo.getRet() == HogeDao.getRET_NORMAL(){
//エラー処理
}else if(outVo.getRet() == HogeDao.getRET_WARNING(){

以下省略

処理の判定もあるし、トランザクション制御のためにDBコネクションはDaoの外からセットする必要はある。


参考
Javaデータアクセスの基礎「ストアド・プロシージャを利用する」*1
JAVA ServletJSP + Oracle9i 編4 - JDBC、ストアド呼び出し、prepareCall*2