dowhile, exception, dynamicQuery

HakJun·2022년 2월 22일
0

Database

목록 보기
11/16

do while을 이용한 sql 프로그래밍(1부터 100까지 7의배수를 제외하고 덧셈하기)

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에서의 예외처리

예외가 발생하는 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;
profile
백엔드 & 전공 공부

0개의 댓글