개요
프로시저를 분석하다 보면 PREPARE라는 구문을 종종 발견하게 되는데, 이번 글에서는 관련 개념을 정리해보려고 한다.
Prepared Statement
Prepared Statement은 미리 컴파일된 문장을 의미하며, 컴파일하여 저장해 둔 문장을 여러 번 실행할 수 있을 뿐만 아니라 자리 표시자를 활용하여 동적으로 SQL을 실행시킬 수도 있다. 미리 컴파일된 문장을 활용하기 때문에 구문을 실행시킬 때마다 분석하는 오버헤드를 줄일 수 있다는 장점이 있다.
MySQL에서는 PREPARE(컴파일) -> EXECUTE(실행) -> DEALLOCATE PREPARE(해제)의 흐름으로 Prepared Statement을 사용한다.
PREPARE
PREPARE는 SQL문을 주닙하고 나중에 참조할 수 있도록 이름을 지정한다.
PREPARE stmt_name FROM preparable_stmt
-- 예시
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
준비된 SQL문은 EXECUTE로 실행되고, DEALLOCATE PREPARE로 해제된다. 프로시저와 달리 Prepared Statement은 단일 문장으로만 구성되어야 한다.
EXECUTE
EXECUTE는 PREPARE로 준비한 SQL을 실행시킨다. SQL에 자리 표시자가 포함되어 있는 경우에는 USING 절을 사용하여 바인딩할 값에 해당하는 변수를 제공해주어야 한다.
EXECUTE stmt_name
[USING @var_name [, @var_name] ...
-- 예시
SET @a = 3;
EXECUTE stmt1 USING @a, @a;
DEALLOCATE PREPARE
DEALLOCATE PREPARE는 PREPARE 했던 SQL을 해제하는 역할을 한다. 참고로 할당을 해제한 SQL을 실행하고자 하면 당연히 오류가 발생하게 되며, 할당했던 SQL을 적절하게 해제하지 않아 너무 많은 SQL문을 할당하게 되면 max_pready_stmt_count 값에 의한 제한이 발생할 수도 있다.
{DEALLOCATE | DROP} PREPARE stmt_name
-- 예시
DEALLOCATE PREPARE stmt1;
DROP을 사용해도 동일한 결과를 얻을 수 있다.
참고 문서
https://www.tutorialspoint.com/mysql/mysql_prepare_statement.htm
https://dev.mysql.com/doc/refman/8.4/en/sql-prepared-statements.html