DB +@

Sirius·2024년 12월 27일
post-thumbnail

DB - 프로시저와 트리거



  • 프로시저
  • 트리거



스토어드 프로시저

  • DELIMITER는 구문문자 정의의 기능을 한다. EX) DELIMIETER $$ -> $$를 C언어에서 ; 처럼 사용하겠다는 선언

    		> DELIMITER로 PROCEDURE 정의 문자 선언을 안하면, 내부 구문과 프로시저 구문의 구분이 어렵다.
      
    		> 마지막에 DELIMITER ;를 한 이유도 마찬가지로 다시 구문문자 정의를 ;로 바꾸기 위함이다.
  • @는 세션이 끝나기 전까지 변수를 유지해주는 역할을 한다. 이는 프로시저가 끝나고도 변수의 값을 유지한다


> 매개변수 활용 프로시저
DELIMITER $$
CREATE OR REPLACE PROCEDURE getName(
	IN `name` CHAR(10),
	OUT userName CHAR(15)
)
BEGIN
	SELECT uname
	INTO userName
	FROM usertbl
	WHERE uname = `name`;
END$$
DELIMITER ;

CALL getName('이승기', @namie);

SELECT @namie;


> if then문 활용
DELIMITER $$
CREATE OR REPLACE PROCEDURE empProc(
	IN id CHAR(3)
)
BEGIN 
	DECLARE `year` INT;
	
	SELECT YEAR(hire_date)
	INTO `year`
	FROM employee
	WHERE emp_id = id;
	
	if `year` >= 2010 then
		SELECT '10년대 입사';
	ELSEIF `year` >=2000 then
		SELECT '00년대 입사';
	ELSE SELECT '입싸';
	END if;
END $$
DELIMITER ;

CALL empProc('209');

> case when then문 활용
DELIMITER $$
CREATE OR REPLACE PROCEDURE gradeProc(
	IN score TINYINT
)
BEGIN 
	DECLARE grade CHAR(2);
	
	case 
		when score >= 90 then SET grade = 'A';
		when score >= 80 then SET grade = 'B';
		when score >= 70 then SET grade = 'C';
		ELSE SET grade = 'F';
	END case;
	
	SELECT grade;
END$$
delimiter ;

CALL gradeProc(90);


> while do 문 활용
DELIMITER $$
CREATE OR REPLACE PROCEDURE sumProc()
BEGIN 
	DECLARE i INT;
	DECLARE SUM INT;
	
	SET i = 1;
	SET SUM = 0;
	
	while i <= 10 do
		SET SUM = SUM + i;
		SET i = i + 1;
	END while;
	
	SELECT CONCAT('1부터 10까지의 합:', SUM);
	
END$$
DELIMITER ;

CALL sumProc();

> sql error handler
> DECLARE CONTINUE/EXIT/UNDO HANDLER FOR NOT FOUND/SQLEXCEPTION ...
DELIMITER $$
CREATE OR REPLACE PROCEDURE handleProc()
BEGIN
	DECLARE CONTINUE handler FOR SQLEXCEPTION	
		SELECT 'error emerge';
	SELECT '안녕';
END$$
DELIMITER ;

CALL handleProc();

DROP PROCEDURE handleProc;

트리거

  • 테이블에 삽입, 수정, 삭제 등의 작업이 일어날 때, 자동으로 작동되는 객체
  • DML 문에 발생하는 이벤트
  • 임의 실행 불가, 이벤트 발생 시에 자동 수행
  • 매개변수 사용 불가, view에 사용 불가
  • BEFORE/AFTER TRIGGER가 있다
DELIMITER $$
CREATE OR REPLACE TRIGGER inserTrigger
AFTER insert ON employee
FOR EACH row
BEGIN
	--
END$$
DELIMITER ;











0개의 댓글