MySQL에서 쿼리 실행 후 몇 개의 행이 변경되었는지 확인해야 하는 경우가 자주 있습니다. 이때 ROW_COUNT() 함수와 동적 SQL 실행 기능을 조합한 저장 프로시저를 활용하면 편리합니다.
영향을 받은 행 수를 계산하는 저장 프로시저
다음은 임의의 MySQL 쿼리를 문자열로 전달받아 실행한 뒤, 그 결과로 영향을 받은 행의 수를 반환하는 저장 프로시저입니다.
mysql> DELIMITER //
mysql> CREATE PROCEDURE `query`.`row_cnt` (IN command VarChar(60000))
-> BEGIN
-> SET @query = command;
-> PREPARE stmt FROM @query;
-> EXECUTE stmt;
-> SELECT ROW_COUNT() AS 'Affected rows';
-> END //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
프로시저의 동작 원리
이 프로시저는 다음과 같은 단계로 동작합니다.
1. 동적 쿼리 준비: 입력 매개변수로 받은 쿼리 문자열을 사용자 변수 @query에 저장한 후, PREPARE 문으로 실행 가능한 형태로 준비합니다.
2. 쿼리 실행: EXECUTE 문을 통해 준비된 쿼리를 실제로 실행합니다.
3. 결과 확인: ROW_COUNT() 함수는 직전에 실행된 문장에서 INSERT, UPDATE, DELETE 등으로 영향을 받은 행의 수를 반환합니다. 이 값을 'Affected rows'라는 별칭과 함께 출력합니다.
저장 프로시저 사용 예제
먼저 테스트용 테이블을 생성합니다.
mysql> CREATE TABLE Testing123(First Varchar(20), Second Varchar(20));
Query OK, 0 rows affected (0.48 sec)
이제 프로시저를 호출하여 INSERT 쿼리를 실행하고, 영향을 받은 행 수를 확인해 보겠습니다.
mysql> CALL row_cnt("INSERT INTO testing123(First,Second) Values('Testing First','Testing Second');");
+---------------+
| Affected rows |
+---------------+
| 1 |
+---------------+
1 row in set (0.10 sec)
Query OK, 0 rows affected (0.11 sec)실행 결과 한 개의 행이 삽입되었으므로 Affected rows가 1로 표시됩니다. 이처럼 UPDATE나 DELETE 문에도 동일하게 적용할 수 있어, 배치 작업이나 데이터 마이그레이션 시 처리 건수를 손쉽게 검증하는 데 유용하게 활용할 수 있습니다.