반응형

[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' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형