VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
스토어드 프로시저 만들기
MySQL은 프로시저 본문 안의;가 CREATE PROCEDURE 문을 일찍 끝내지 않도록 DELIMITER로 문장 종결자를 바꿉니다.
CALL로 호출하세요:
매개변수
프로시저는 세 가지 매개변수 모드를 지원합니다:OUT 매개변수에는 사용자 정의 변수를 사용해 호출하세요:
지역 변수
BEGIN...END 블록의 맨 위, 다른 어떤 문장보다 앞에서 DECLARE로 지역 변수를 선언하세요:
제어 흐름
MySQL 프로시저는 표준 제어 흐름 구문을 지원합니다:오류 처리
DECLARE ... HANDLER를 사용해 오류를 잡으세요:
EXIT HANDLER는 조건이 발생하면 프로시저를 중단합니다. CONTINUE HANDLER는 프로시저가 계속 실행되게 합니다. RESIGNAL은 오류를 호출자에게 다시 발생시킵니다.
SIGNAL로 직접 오류를 발생시키세요:
45000은 “처리되지 않은 사용자 정의 예외”를 뜻하는 SQLSTATE입니다.
커서
커서는 프로시저 안에서 결과 집합을 한 행씩 순회합니다. 로직을 집합 연산으로 표현할 수 없을 때 사용하세요.NOT FOUND 핸들러는 커서의 행이 바닥나면 v_done을 설정합니다. 프로시저가 끝나기 전에 항상 커서를 닫으세요.
스토어드 프로시저와 함수 비교
로직을 SQL 표현식에 포함해야 할 때는 함수를 사용하세요. 그 밖의 모든 것 — 여러 단계의 처리, 조건 로직, 부수 효과 — 에는 프로시저를 사용하세요.
스토어드 프로시저를 사용해야 할 때
스토어드 프로시저는 다음과 같은 경우에 의미가 있습니다:- 어떤 애플리케이션이나 사용자가 쿼리를 실행하든 적용되어야 하는 비즈니스 규칙을 강제할 때
- 여러 단계의 작업(복잡한 배치 작업, 데이터 마이그레이션)에서 왕복을 줄일 때
- 기반 테이블을 노출하지 않고 사용자에게 특정 작업에 대한 접근을 부여할 때(
GRANT EXECUTE ON PROCEDURE)
- 로직이 자주 바뀔 때 — 배포에 ALTER PROCEDURE나 DROP/재생성이 필요함
- 디버깅이 필요할 때 — 디버거가 없고 SIGNAL 기반 로깅만 있음
- 이식성이 중요할 때 — 스토어드 프로시저 구문은 MySQL 전용임
자주 묻는 질문
스토어드 프로시저가 결과 집합을 반환할 수 있나요?
예. 프로시저 안에서INTO를 사용하지 않는 모든 SELECT는 결과 집합을 호출자에게 보냅니다:
SELECT 문은 여러 결과 집합을 보냅니다. 대부분의 클라이언트는 이를 처리하지만 일부 ORM은 처리하지 못합니다.
데이터베이스의 모든 스토어드 프로시저를 어떻게 보나요?
문제 해결
VillageSQL: 스토어드 프로시저에서의 사용자 정의 확장 타입
VillageSQL 사용자 정의 확장 타입(예:COMPLEX, UUID, TVECTOR)은 스토어드 프로시저 매개변수 타입과
DECLARE 변수 타입으로 사용할 수 있습니다. 먼저 확장을 설치한 다음,
프로시저 정의에서 그 타입을 참조하세요:
함께 보기
- MySQL 트리거 — 트리거는 스토어드 프로시저 로직이나 인라인 SQL을 호출합니다
- MySQL의 트랜잭션 — 스토어드 프로시저는 흔히 작업을 트랜잭션으로 감쌉니다
- 확장 프로그램 제거 — 스토어드 프로시저가 확장 타입을 사용할 때의 제한