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

MySQL 저장 프로시저 출력 억제하는 방법 총정리

MySQL에서 저장 프로시저(Stored Procedure)를 실행할 때 불필요한 결과 집합이 화면에 출력되지 않도록 하고 싶다면, 사용자 정의 변수(@variable)를 활용하는 것이 효과적인 방법입니다. 이 글에서는 예제 테이블을 만들고, 저장 프로시저 내부에서 SELECT 결과를 변수에 담아 출력을 억제한 뒤, 필요할 때만 값을 꺼내 확인하는 전체 과정을 단계별로 살펴보겠습니다.

1. 예제 테이블 생성

먼저 실습에 사용할 테이블을 생성합니다. 아래 쿼리는 직원 정보를 저장할 간단한 person_information 테이블을 만듭니다.

mysql> create table person_information
-> (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.50 sec)

2. 샘플 데이터 삽입

INSERT 문을 사용해 테이블에 몇 개의 레코드를 추가합니다.

mysql> insert into person_information values(100,'John');
Query OK, 1 row affected (0.17 sec)

mysql> insert into person_information values(101,'Chris');
Query OK, 1 row affected (0.22 sec)

mysql> insert into person_information values(102,'Robert');
Query OK, 1 row affected (0.16 sec)

3. 저장된 데이터 확인

SELECT 문으로 테이블에 들어간 데이터를 조회해 보겠습니다.

mysql> select * from person_information;

실행하면 다음과 같은 결과가 출력됩니다.

+------+--------+
| Id | Name |
+------+--------+
| 100 | John |
| 101 | Chris |
| 102 | Robert |
+------+--------+
3 rows in set (0.00 sec)

4. 출력을 억제하는 저장 프로시저 작성

이제 핵심인 저장 프로시저를 만들어 보겠습니다. 포인트는 SELECT 쿼리 결과를 직접 반환하지 않고, @output이라는 세션 변수에 할당한다는 것입니다. 이렇게 하면 프로시저 호출 시 결과 집합이 클라이언트로 전송되지 않습니다.

mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_supressOutputDemo()
-> BEGIN
-> set @output=(select Name from person_information where id=101);
-> END
-> //
Query OK, 0 rows affected (0.14 sec)

mysql> DELIMITER ;

참고: DELIMITER //는 프로시저 본문 안의 세미콜론(;)이 MySQL 클라이언트에 의해 문장 종료로 해석되지 않도록 구분 기호를 임시로 변경하는 명령입니다. 프로시저 생성이 끝나면 반드시 DELIMITER ;로 원래대로 되돌려야 합니다.

5. 프로시저 호출 및 결과 확인

CALL 명령으로 위에서 만든 저장 프로시저를 실행합니다.

mysql> call sp_supressOutputDemo();
Query OK, 0 rows affected (0.00 sec)

프로시저를 호출했지만 아무런 결과 집합도 출력되지 않는 것을 확인할 수 있습니다. 이것이 바로 출력이 억제된 상태입니다. 저장된 값은 변수에 그대로 남아 있으므로, 값이 필요할 때 SELECT 문으로 조회하면 됩니다.

mysql> select @output;

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

+---------+
| @output |
+---------+
| Chris |
+---------+
1 row in set (0.00 sec)

마무리

MySQL 저장 프로시저에서 SELECT 결과가 자동으로 출력되지 않게 하려면, 결과를 로컬 변수나 사용자 정의 변수(@변수)에 할당하기만 하면 됩니다. 이 방식은 배치 작업이나 백그라운드 처리처럼 중간 결과를 화면에 노출하고 싶지 않은 상황에서 특히 유용하며, 최종 결과만 선택적으로 조회함으로써 애플리케이션과 클라이언트 간의 불필요한 데이터 전송도 줄일 수 있습니다.