WorkaHolic

MySQL로 프로시저 작성시 주의사항

2010. 4. 8. 23:33
반응형

프로시저 내부 변수는 테이블 필드명과 반드시 구분을 해야 한다.

 

DECLARE user_Exp INT DEFAULT 0;

SELECT user_exp INTO user_Exp  FROM TB_USER WHRER user_id = p_user_id;

 

문자열 붙이는건 CONCAT 을 이용하자.. 숫자같은 문자는 걍 더해버리는 문제 -_-;;

 

프로시저의 OUT 존재시

PDO 에러 꼼수 인지 아닌지 모르지만..해결책

 

 

 function _setTest( $prm1, $prm2 ){
  $this->arrData = null;
  $this->sql = "call usp_setTest(?,?,@dbErr)";

  $stmt = $this->db->prepare($this->sql);
  $stmt->bindParam(1, $prm1, PDO::PARAM_INT, 9);
  $stmt->bindParam(2, $prm2, PDO::PARAM_INT, 3);  
  try {
        $stmt->execute();  // 쿼리 실행 후 다시 셀렉트 -_- output을 한번에 처리하면 에러남 왜그럴까..? 누가 알려줘요.
        $this->sql = "SELECT @dbErr AS dbErr";
        $stmt = $this->db->prepare($this->sql);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
       if ( ! $stmt->execute() )

       {
            $this->_errLog( '_setLog', $this->sql );
            echo "PDO Error 1.1:\n";
            print_r($stmt->errorInfo());
           return false;
       }
      $this->arrData = $stmt->fetch();
      if ($this->arrData['dbErr'] > 0)
      {
            return false;
       }
   }
  catch(PDOException $e){
      print_r($stmt->errorInfo());
  }
  unset($stmt);
  return true;
  
 } // end of _setTest

 

 

에러를 피하기 위해서 썻다..-_-;;

 

 

 

IF

ELSEIF

ELSE

END IF;

 

블럭을 지정해도 쌩까고 다른 블럭을 침범하는 경우가 있었다..왤까 -_-;

해결책

 

LEAVE 이용

 

spChk: BEGIN

  IF A=B THEN

      -- 처리 구문

      LEAVE spChk; -- spChk를 블럭을 빠져나간다.

  ELSEIF A=C THEN

      -- 처리 구문

      LEAVE spChk; -- spChk를 블럭을 빠져나간다.

  ELSE

      -- 처리 구문

  EDN IF;

END spChk;

 

 

 

HANDLER 이용하기

dbErr 코드는 자신이 판단하기 쉽게 정하자

 

DECLARE EXIT HANDLER FOR SQLEXCEPTION SET dbErr = -1;
SET dbErr = 0;

 

errChk: BEGIN

  IF A=B THEN

      -- 처리 구문

      SET dbErr = 1;

      LEAVE errChk;

  ELSEIF A=C THEN

      -- 처리 구문

      SET dbErr = 2;

      LEAVE spChk;

  ELSE

      -- 정상 처리 구문

  EDN IF;

END errChk;

 

 

프로시저 내에서 변수 지정 및 값 넣기

DECLARE 변수 타입 기본값

DECLARE i_err INT DEFAULT 0;

DECLARE i_err_msg VARCHAR(100);

 

SELECT err, err_msg INTO i_err, i_err_msg FROM tb_err_code WHERE eno = 100;

-- 변수값 받기

SELECT i_err, i_err_msg;

 

계속 정리할 예정..

반응형