반응형
[MariaDB] 마리아DB SQL 쿼리 고급 - SQL 프로그래밍 (MySQL)
IF ELSE
DROP PROCEDURE IF EXISTS ifProc; -- 기존에 프로시저가 존재한다면 삭제
DELIMITER $$
CREATE PROCEDURE ifProc() -- ifProc() 프로시저 생성
BEGIN
DECLARE var1 INT; -- var1 변수선언
SET var1 = 100; -- 변수에 값 대입
IF var1 = 100 THEN -- 만약 @var1이 100이라면,
SELECT '100입니다.';
ELSE -- 아니라면
SELECT '100이 아닙니다.';
END IF; -- IF 끝
END $$
DELIMITER ;
CALL ifProc(); -- 프로시저 호출하여 결과값 '100입니다.' 출력
IF ELSEIF ELSE
DROP PROCEDURE IF EXISTS ifProc;
DELIMITER $$
CREATE PROCEDURE ifProc()
BEGIN
DECLARE point INT ;
DECLARE credit CHAR(1);
SET point = 77 ;
IF point >= 90 THEN -- IF문
SET credit = 'A';
ELSEIF point >= 80 THEN
SET credit = 'B';
ELSEIF point >= 70 THEN -- ELSEIF문 여기에 해당되어 실행
SET credit = 'C';
ELSEIF point >= 60 THEN
SET credit = 'D';
ELSE -- 아무것에도 해당되지 않을때 실행
SET credit = 'F';
END IF;
SELECT CONCAT('취득점수==>', point), CONCAT('학점==>', credit); -- point, credit 출력
END $$
DELIMITER ;
CALL ifProc(); -- 프로시저 호출하여 결과 "취득점수==>77 학점==>C" 출력
CASE
DROP PROCEDURE IF EXISTS caseProc;
DELIMITER $$
CREATE PROCEDURE caseProc()
BEGIN
DECLARE point INT ;
DECLARE credit CHAR(1);
SET point = 77 ;
CASE -- CASE문
WHEN point >= 90 THEN
SET credit = 'A';
WHEN point >= 80 THEN
SET credit = 'B';
WHEN point >= 70 THEN -- 여기 WHEN에 해당되어 THEN 뒤를 실행
SET credit = 'C';
WHEN point >= 60 THEN
SET credit = 'D';
ELSE -- 어떤것도 해당되지 않을때
SET credit = 'F';
END CASE;
SELECT CONCAT('취득점수==>', point), CONCAT('학점==>', credit);
END $$
DELIMITER ;
CALL caseProc(); -- 프로시저 호출하여 "취득점수==>77 학점==>c" 출력
WHILE
DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
DECLARE i INT; -- 1에서 100까지 증가할 변수
DECLARE hap INT; -- 더한 값을 누적할 변수
SET i = 1;
SET hap = 0;
WHILE (i <= 100) DO -- WHILE문 시작
SET hap = hap + i; -- hap의 원래의 값에 i를 더해서 다시 hap에 넣으라는 의미
SET i = i + 1; -- i의 원래의 값에 1을 더해서 다시 i에 넣으라는 의미
END WHILE;
SELECT hap; -- hap을 조회
END $$
DELIMITER ;
CALL whileProc(); -- 프로시저 호출 hap을 조회 "5050" 출력
WHILE INTERATE / LEAVE
DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
DECLARE i INT; -- 1에서 100까지 증가할 변수
DECLARE hap INT; -- 더한 값을 누적할 변수
SET i = 1;
SET hap = 0;
myWhile: WHILE (i <= 100) DO -- While문에 label(myWhile)을 지정. i가 100보다 같거나 작으면 작동. 크면 While을 벗어남.
IF (i%7 = 0) THEN -- i값이 7로 나눴을때 나머지가 0 이면
SET i = i + 1;
ITERATE myWhile; -- 지정한 label문으로 가서 계속 진행. 아래는 실행 안하고 바로 While로 돌아감.
END IF;
SET hap = hap + i; -- i값을 누적
IF (hap > 1000) THEN -- hap가 1000보다 커지면
LEAVE myWhile; -- 지정한 label문을 떠남. 즉, While 종료.
END IF;
SET i = i + 1;
END WHILE; -- While로 다시 돌아감
SELECT hap; -- hap 조회
END $$
DELIMITER ;
CALL whileProc(); -- 프로시저 호출 hap 조회 "1029" 출력
오류처리 (DECLARE CONTINUE HANDLER FOR 에러코드 에러시작업내역;)
DROP PROCEDURE IF EXISTS errorProc;
DELIMITER $$
CREATE PROCEDURE errorProc()
BEGIN
DECLARE CONTINUE HANDLER FOR 1146 SELECT '테이블 없음' AS '메시지'; -- 아래 SELECT문이 1146에러 시 '테이블 없음'을 출력
SELECT * FROM noTable; -- noTable은 없는 테이블로 위에 예외처리를 발생시킴
END $$
DELIMITER ;
CALL errorProc();
DROP PROCEDURE IF EXISTS errorProc;
DELIMITER $$
CREATE PROCEDURE errorProc()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION -- 아래 INSERT에서 SQLEXCEPTION 에러 발생시 BEGIN~END 실행하는 예외처리
BEGIN
SHOW ERRORS; -- 오류 메시지를 보여 줌.
SELECT '오류발생. 롤백합니다.' AS '메시지'; -- 오류발생시 '오류발생 롤백합니다' 출력
ROLLBACK; -- 오류 발생시 작업을 롤백시킴.
END;
INSERT INTO userTBL VALUES('ID1004', '김이박', 1990, '서울', NULL,
NULL, 180, CURRENT_DATE()); -- 'ID1004' 값이 중복되는 아이디로 가정하여 위 예외처리 발생
END $$
DELIMITER ;
CALL errorProc(); -- '오류발생. 롤백합니다' 출력 및 오류 메세지 출력 및 롤백작업.
동적SQL (PREPARE / EXECUTE / DEALLOCATE PREPARE)
USE DB명;
PREPARE 쿼리명 FROM 'SELECT * FROM 테이블'; -- SELECT 문을 '쿼리명'으로 준비시킴
EXECUTE 쿼리명; -- '쿼리명'의 SELECT문을 실행시킴
DEALLOCATE PREPARE 쿼리명; --'쿼리명'의 준비를 해제시킴
USE DB명;
DROP TABLE IF EXISTS 테이블명; -- 테이블이 존재한다면 지워줌
CREATE TABLE 테이블명 (id INT AUTO_INCREMENT PRIMARY KEY, mDate DATETIME); -- 테이블 생성 (ID, 현재날짜시간)
SET @curDATE = CURRENT_TIMESTAMP(); -- @curDATE에 현재 날짜와 시간 입력
PREPARE 쿼리명 FROM 'INSERT INTO myTable VALUES(NULL, ?)'; -- 쿼리명 준비. 뒤에 '?'는 아래에서 정의함
EXECUTE 쿼리명 USING @curDATE; -- 쿼리명 실행. ?에는 @curDATE 변수를 대입함.
DEALLOCATE PREPARE 쿼리명; -- 쿼리명 해제
SELECT * FROM 테이블명;
반응형
'MariaDB' 카테고리의 다른 글
[MariaDB] 마리아DB 테이블 - HeidiSQL로 테이블 생성 및 기본키 외래키 설정 (MySQL) (0) | 2020.09.11 |
---|---|
[MariaDB] 마리아DB SQL 쿼리 고급 - JOIN 조인 (MySQL) (0) | 2020.08.30 |
[MariaDB] 마리아DB SQL 쿼리 고급 - LONGTEXT (MySQL) (0) | 2020.08.30 |