일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 용인중앙시장
- 생와사비
- 강아지간식
- 이마트
- 10월와인장터
- 스시
- 와인초특가
- 샘표계란이맛있어지는간장
- gs25
- 와인장터
- 이마트와인장터
- 와사비
- 와인할인
- 이마트와인
- 기흥반려견놀이터
- 고추냉이
- 반려견놀이터
- 자연에서갈아만든생와사비
- 별빛마당
- 용인야시장
- 와인특가
- 주비푸드
- 10월장터
- 삼양맵탱
- 10월와인
- mysql1267
- 초밥
- 용인중앙시장야시장
- gs25맵탱
- 용인강아지놀이터
- Today
- Total
기억의 기록
Mysql - CREATE PROCEDURE 본문
Mysql 에서는 CREATE PROCEDURE 혹은 CREATE FUNCTION 을 저장 루틴(stored routine)이라고 표현합니다.
Mysql 문서를 보면 많이 복잡하지만 많이 사용하는 방식은 아래와 같습니다.
USE database_name;
DROP PROCEDURE IF EXISTS procedure_name;
DELIMITER $$
CREATE PROCEDURE procedure_name (
IN i_param_1 bigint,
IN i_param_2 varchar(10),
IN i_param_3 datetime
)
COMMENT 'procedure_comment'
BEGIN
PROCEDURE_BODY:
BEGIN
SELECT '처리할 명령';
END PROCEDURE_BODY;
END$$
DELIMITER ;
DELIMITER $$ 는 문장의 끝을 세미콜론(;)으로 정의하는데 프로시저 안에서도 문장의 끝을 세미콜론으로 사용하기 때문에 $$ 로 임시로 바꾸고 프로시저를 만든 다음에 다시 세미콜론으로 바꿔주게 됩니다.
db_work 라는 DB 에 procedre 를 생성하고 호출을 해봅니다.
USE db_work;
DROP PROCEDURE IF EXISTS sp_procedure_test;
DELIMITER $$
CREATE PROCEDURE sp_procedure_test (
IN i_param_1 bigint,
IN i_param_2 varchar(10),
IN i_param_3 datetime
)
COMMENT 'procedure_comment'
BEGIN
PROCEDURE_BODY:
BEGIN
SELECT CONCAT(i_param_1, ' 은 bigint,', i_param_2, ' 는 varchar(10), ', i_param_3, '는 datetime 입니다.') AS select_string;
END PROCEDURE_BODY;
END$$
DELIMITER ;
실행은 CALL 에 인풋 파라미터 3개를 넣어 줍니다.
CALL sp_procedure_test(123,'abc','2000-01-01 00:00:00');
결과가 이쁘게 나옵니다.
소스의 SELECT CONCAT 자리에 반복문 혹은 계산식등 처리될 일련의 명령어가 들어가면 인풋 파라미터만 변경하면 쉽게 처리 됩니다.
SELECT 하지 않고 OUTPUT 변수로 리턴을 받아 재사용을 해야 하면 아래와 같이 변경하면 됩니다.
USE db_work;
DROP PROCEDURE IF EXISTS sp_procedure_test;
DELIMITER $$
CREATE PROCEDURE sp_procedure_test (
IN i_param_1 bigint,
IN i_param_2 varchar(10),
IN i_param_3 datetime,
OUT o_output varchar(100)
)
COMMENT 'procedure_comment'
BEGIN
PROCEDURE_BODY:
BEGIN
SET o_output = CONCAT(i_param_1, ' 은 bigint,', i_param_2, ' 는 varchar(10), ', i_param_3, '는 datetime 입니다.');
END PROCEDURE_BODY;
END$$
DELIMITER;
다른점은 OUT 이라는 output 파라미터가 추가됐고 SELECT 대신 SET 을 사용합니다.
AS select_string 도 삭제해야 에러가 없습니다.
SELECT 를 하지 않고 OUTPUT 파라미터로 변경해서 리턴하기 때문에 프로시저 호출 후 SELECT 를 해야 합니다.
CALL sp_procedure_test(123,'abc','2000-01-01 00:00:00',@o_output);
SELECT @o_output;
그러면 @o_output 으로 똑같은 결과가 리턴됩니다.
사용하는 방식에 따라서 필요하게 만들면 됩니다.
https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html
MySQL :: MySQL 8.0 Reference Manual :: 13.1.17 CREATE PROCEDURE and CREATE FUNCTION Statements
13.1.17 CREATE PROCEDURE and CREATE FUNCTION Statements CREATE [DEFINER = user] PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = user] FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
dev.mysql.com
'개발 > Mysql' 카테고리의 다른 글
Mysql - Procedure Error Code: 1267. Illegal mix of collations workbench (0) | 2023.09.20 |
---|---|
Mysql - Error Code: 1267. Illegal mix of collations 에러 해결 (0) | 2023.09.19 |
Mysql - DATE_FORMAT(date,format) (0) | 2023.09.07 |