db/MySQL
[MySQL] Stored Procedure
잘할수있을거야
2022. 8. 4. 10:24
- Stored Procedure 생성
DELIMITER //
CREATE PROCEDURE 프로시져명()
BEGIN
수행문1;
수행문2;
END //
DELIMITER ;
- Stored Procedure 호출
CALL 프로시져(); //파라메터가 없는 경우
CALL 프로시져(파라메터...) //파라메터가 존재하는 경우
- Stored Procedure 삭제
DROP PROCEDURE [IF EXISTS] 프로시져명;
//삭제하기 위해서는 ALTER ROUTINE 권한이 필요하다
- Stored Procedure 파라메터 종류
IN (default 모드), OUT, INOUT
DELIMITER $$
CREATE PROCEDURE 프로시져명([IN|OUT|INOUT] 파라메터명 타입[길이])
BEGIN
...
END $$
DELIMITER ;
-- IN 동작 (값을 받기만 하고 외부 인자에 영향을 미치지 않음)
DELIMITER $$
CREATE PROCEDURE sp_para_in(IN para_in INT)
BEGIN
SELECT para_in AS '프로시져 시작하자마자 넘긴 값 읽음';
SET para_in = 100;
SELECT para_in AS '프로시져 내부에서 값 변경';
END $$
DELIMITER ;
SET @test = 1;
SELECT @test AS '넘긴 사용자 변수 값';
CALL sp_para_in(@test);
SELECT @test AS '프로시져 종료 후 사용자 변수 값';
프로시져 내부에서는 읽고 변경할 수 있지만, 호출시 넘겨준 @test에는 영향을 주지 않는다.
-- OUT 동작 (값을 받는 역할이 아닌 값을 만들어 내는 역할)
DELIMITER $$
CREATE PROCEDURE sp_para_out(OUT para_out INT)
BEGIN
SELECT para_out AS '프로시져 시작하자마자 넘긴 값 읽음';
SET para_out = 100;
SELECT para_out AS '프로시져 내부에서 값 변경';
END $$
DELIMITER ;
SET @test = 1;
SELECT @test AS '넘긴 사용자 변수 값';
CALL sp_para_out(@test);
SELECT @test AS '프로시져 종료 후 사용자 변수 값';
프로시져 호출시 값을 넘겨도 OUT(출력)전용 역할의 파라메터이므로 IN파라메터 처럼 정상적인 값을 읽을 수 없고 NULL로 읽히게 된다.
프로시져 내부에서 값을 변경하면 @test에 영향을 미친다.
-- INOUT 동작 (값을 받을 수도 있고 프로시져 내부에서 변경한 값이 외부 인자에 영향을 미친다)
DELIMITER $$
CREATE PROCEDURE sp_para_inout(INOUT para_in_out INT)
BEGIN
SELECT para_in_out AS '프로시져 시작하자마자 넘긴 값 읽음';
SET para_in_out = 100;
SELECT para_in_out AS '프로시져 내부에서 값 변경';
END $$
DELIMITER ;
SET @test = 1;
SELECT @test AS '넘긴 사용자 변수 값';
CALL sp_para_inout(@test);
SELECT @test AS '프로시져 종료 후 사용자 변수 값';
INOUT의 IN특성으로 넘어온 값을 읽을 수 있다.
INOUT의 OUT특성으로 외부에 영향을 미친다.
- 프로시져 변경
프로시져는 ALTER 문이 없어서 수행문이나 파라메터가 변경되어야 하면
DROP PROCEDURE 후 CREATE PROCEDURE를 사용해야 한다.
프로시져 프로그램을 만들기 위한 문법은 다음 글에 이어서