본문 바로가기
Data/MySQL

[MySQL] 저장 프로시저의 매개변수 - IN, OUT, INOUT

by prinha 2021. 1. 7.
728x90
반응형

prinha.tistory.com/entry/MySQL-Stored-Procedure%EC%9D%98-%EB%B3%80%EC%88%98

 

[MySQL] Stored Procedure의 변수

prinha.tistory.com/entry/MySQL-%EC%8A%A4%ED%86%A0%EC%96%B4%EB%93%9C-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80Stored-Procedure-%EC%82%AC%EC%9A%A9%EB%B2%95 [MySQL] 스토어드 프로시저(Stored Procedure) 사용..

prinha.tistory.com


저장 프로시저 매개변수의 3가지 모드(mode)

# 저장 프로시저에 매개변수를 정의하는 문법
MODE 매개변수이름 데이터타입(사이즈)

 

IN

프로시저에 값을 전달하며, 프로시저 내부에서 값을 수정할 수는 있지만 프로시저가 반환되고나서 호출자가 수정할 수는 없다.

즉 원본 값은 저장 프로시저가 끝난 후에도 유지되어지며 저장프로시저는 IN매개변수의 복사본만을 사용한다는 뜻이다.

# 프로시저 생성

USE `classicmodels`;
DROP procedure IF EXISTS `GetOfficeByCountry`;

DELIMITER $$
USE `classicmodels`$$
CREATE PROCEDURE `GetOfficeByCountry` (IN countryName VARCHAR(255))
BEGIN
	SELECT * FROM offices
	WHERE country = countryName;
END$$

DELIMITER ;
CALL GetOfficeByCountry('USA');

 

OUT

프로시저의 값을 호출자에게 다시 전달한다.

초기값은 프로시저 내에서 NULL값이며 프로시저가 반환될 때 새로운 값이 호출자에게 리턴된다.

프로그램이 시작될 때, OUT매개변수의 초기값에 접근할 수 없다.

USE `classicmodels`;
DROP procedure IF EXISTS `CountOrderByStatus`;

DELIMITER $$
USE `classicmodels`$$
CREATE PROCEDURE `CountOrderByStatus` (IN orderStatus VARCHAR(25),OUT total INT)
BEGIN
    SELECT count(orderNumber)
    INTO total #매개변수 total에 count 복사
    FROM orders
    WHERE status = orderStatus;
END$$

DELIMITER ;
CALL CountOrderByStatus('Shipped', @total); # 세션매개변수 total에 값 저장
SELECT @total; # @total값 호출

CALL CountOrderByStatus('in process',@total);
SELECT @total AS total_in_process;

 

INOUT

호출자에 의해 하나의 변수가 초기화되고 프로시저에 의해 수정된다. IN+OUT의 결합이다. 

프로시저가 리턴할 때 프로시저가 변경한 사항은 호출자에게 리턴된다.

USE `classicmodels`;
DROP procedure IF EXISTS `set_counter`;

DELIMITER $$
USE `classicmodels`$$
CREATE PROCEDURE `set_counter` (INOUT count INT(4), IN x INT(4))
BEGIN
	SET count=count+x;
END$$

DELIMITER ;
SET @counter = 10;
CALL set_counter(@counter, 1); #SELECT @counter = 11
CALL set_counter(@counter, 2); #SELECT @counter = 13
CALL set_counter(@counter, 5); #SELECT @counter = 18
SELECT @counter; #18

 

 


참고 및 출처 : blog.duveen.me/14?category=657591

728x90
반응형