http://blog.naver.com/webjeck?Redirect=Log&logNo=130083150882
프로시저 내부 변수는 테이블 필드명과 반드시 구분을 해야 한다.
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;
계속 정리할 예정..
[출처] MySQL로 프로시저 작성시 주의사항|작성자 진카자마
'Project > Home빌더' 카테고리의 다른 글
도메인 포워딩 (0) | 2010.07.02 |
---|---|
테스팅된 프로시저 (0) | 2010.07.02 |
홈페이지 빌더 DB모델링 (0) | 2010.06.21 |