DROP PROCEDURE IF EXISTS whileProc2;
DELIMITER $$
CREATE PROCEDURE whileProc2()
BEGIN
DECLARE i INT; -- 1에서 100까지 증가할 변수
DECLARE hap INT; -- 더한 값을 누적할 변수
SET i = 1; --i초깃값
SET hap = 0; --총합
myWhile: WHILE (i <= 100) DO -- While문에 label을 지정
IF (i%7 = 0) THEN --7의배수라면
SET i = i + 1; --총합에 더하지 않고 점프
ITERATE myWhile; -- 지정한 label문으로 가서 계속 진행
END IF;
SET hap = hap + i; --총합에 덧셈
IF (hap > 1000) THEN --1000이넘으면
LEAVE myWhile; -- 지정한 label문을 떠남. 즉, While 종료.
END IF;
SET i = i + 1;
END WHILE;
SELECT hap;
END $$
DELIMITER ;
CALL whileProc2();
주어진 결과값은 정상적으로 1029가 나오는 것을 확인할 수 있다.
예외가 발생하는 SQL구문 실행시 기존에는 ERROR와 함께 실행되지가 않았다면, 해당에러에 대한 결과값을 지정한 값으로 반환시켜보았다.
1.
DROP PROCEDURE IF EXISTS errorProc;
DELIMITER $$
CREATE PROCEDURE errorProc()
BEGIN
DECLARE CONTINUE HANDLER FOR 1146 SELECT '테이블이 없어요ㅠㅠ' AS '메시지'; --ERROR HANDLER 1146에 대한 에러메세지, 1146은 noTable에 대한 에러 코드
SELECT * FROM noTable; -- noTable은 없음.
END $$
DELIMITER ;
CALL errorProc();
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
SHOW ERRORS; -- 오류 메시지를 보여 준다.
SELECT '오류가 발생했네요. 작업은 취소시켰습니다.' AS '메시지';
ROLLBACK; -- 오류 발생시 작업을 롤백시킨다.
END;
INSERT INTO usertbl VALUES('LSG', '이상구', 1988, '서울', NULL,
NULL, 170, CURRENT_DATE()); -- 중복되는 아이디이므로 오류 발생
END $$
따로 에러메세지를 선택하지 않을 경우 show errors 에서 해당 에러메세지가 보이는 것을 확인할 수 있다.
주어진 조건등에 대해 조회를 할때, 이후에 대입값을 통해 조건을 충족시켜쿼리를 실행시킬 때 사용한다.
USE sqldb;
DROP TABLE IF EXISTS myTable;
CREATE TABLE myTable (id INT AUTO_INCREMENT PRIMARY KEY, mDate DATETIME);
SET @curDATE = CURRENT_TIMESTAMP(); -- 현재 날짜와 시간
PREPARE myQuery FROM 'INSERT INTO myTable VALUES(NULL, ?)';
EXECUTE myQuery USING @curDATE; --?값에 @curDate를 대입
DEALLOCATE PREPARE myQuery;
SELECT * FROM myTable;