Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 DELIMITER(구분 기호)를 활용한 저장 프로시저 생성 방법

MySQL에서는 CREATE PROCEDURE 명령어를 사용하여 저장 프로시저(Stored Procedure)를 손쉽게 만들 수 있습니다. 다만 프로시저 내부에는 여러 개의 SQL 문장이 세미콜론(;)으로 구분되어 들어가기 때문에, 클라이언트가 이를 하나의 문장으로 잘못 해석하지 않도록 DELIMITER 명령으로 구분 기호를 임시로 변경해 주는 것이 핵심입니다.

저장 프로시저 생성 기본 문법

구분 기호를 변경하고 프로시저를 정의하는 기본 문법은 다음과 같습니다.

delimiter //
CREATE PROCEDURE yourStoreProcedureName()
BEGIN
-- 변수 선언
-- 실행할 쿼리 문장
END //

delimiter //

예제: 테이블 전체 조회 프로시저 만들기

위 문법을 실제로 적용해 보겠습니다. 먼저 사용할 데이터베이스를 선택한 뒤, 구분 기호를 //로 변경하고 프로시저를 생성합니다.

mysql> use test;
Database changed
mysql> delimiter //
mysql> create procedure Sp_callTableStoredProcTable()
-> begin
-> select *from StoredProcTable;
-> end //
Query OK, 0 rows affected (0.54 sec)

구분 기호 복원 후 프로시저 호출하기

프로시저 생성이 완료되면, 일반적인 SQL 문장 실행을 위해 구분 기호를 다시 세미콜론(;)으로 되돌려야 합니다.

mysql> delimiter ;

생성된 저장 프로시저는 CALL 명령어로 호출할 수 있습니다. 기본 문법은 다음과 같습니다.

CALL yourStoredProcedureName();

앞에서 만든 프로시저를 실제로 호출해 보겠습니다.

mysql> call Sp_callTableStoredProcTable();

실행 결과는 다음과 같습니다.

+-----------+------+
| FirstName | Age |
+-----------+------+
| John | 23 |
| Bob | 24 |
| David | 20 |
+-----------+------+
3 rows in set (0.03 sec)

Query OK, 0 rows affected (0.06 sec)

이 예제에서는 'StoredProcTable'이라는 테이블을 사용했으며, 해당 테이블에는 총 3개의 레코드가 저장되어 있습니다. 저장 프로시저를 통해 모든 레코드가 한 번에 출력된 것을 확인할 수 있습니다.

응용 예제: 테이블의 레코드 수 세기

같은 방식으로 집계 함수를 활용한 프로시저도 만들 수 있습니다. 아래 예제는 테이블에 저장된 레코드 수를 반환하는 프로시저입니다.

mysql> delimiter //
mysql> create procedure CountingRecords()
-> begin
-> select count(*) as AllRecords from StoredProcTable;
-> end //
Query OK, 0 rows affected (0.19 sec)

mysql> delimiter ;

CALL 명령어로 프로시저를 호출합니다.

mysql> call CountingRecords();

실행 결과, 테이블의 전체 레코드 수가 출력됩니다.

+------------+
| AllRecords |
+------------+
| 3 |
+------------+
1 row in set (0.31 sec)

Query OK, 0 rows affected (0.33 sec)

정리

MySQL에서 저장 프로시저를 만들 때는 ① DELIMITER로 구분 기호 변경 → ② CREATE PROCEDURE로 프로시저 정의 → ③ DELIMITER를 원래대로 복원 → ④ CALL로 호출의 순서를 기억하면 됩니다. 이 패턴만 익혀두면 변수 선언, 조건 분기, 반복 처리 등을 포함한 더 복잡한 비즈니스 로직도 프로시저 안에서 자유롭게 구현할 수 있습니다.