MySQL에서는 PREPARE 문(프리페어드 스테이트먼트)을 사용하면 SQL 쿼리를 미리 준비해 두었다가 필요할 때 실행할 수 있습니다. 아래 예제를 통해 'Student'라는 이름의 테이블을 프리페어드 스테이트먼트로 생성하고, 해당 테이블에 값을 삽입하는 과정을 살펴보겠습니다.
PREPARE 문으로 테이블 생성하기
먼저 CREATE TABLE 문을 PREPARE로 등록한 뒤, EXECUTE로 실행합니다. 작업이 끝나면 DEALLOCATE PREPARE로 해당 문을 해제하는 것이 좋습니다.
mysql> PREPARE stmt3 FROM 'CREATE TABLE Student(Id INT, Name Varchar(20))'; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> EXECUTE stmt3; Query OK, 0 rows affected (0.73 sec) mysql> DEALLOCATE PREPARE stmt3; Query OK, 0 rows affected (0.00 sec)
준비된 문으로 Student 테이블에 값 삽입하기
INSERT 문에 물음표(?) 플레이스홀더를 사용하면, SET으로 정의한 사용자 변수를 EXECUTE ... USING 구문으로 전달하여 같은 문장을 여러 번 재사용할 수 있습니다.
mysql> PREPARE stmt7 FROM 'INSERT INTO Student(Id,Name) values(?,?)'; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> SET @A = 1, @B = 'Ram'; Query OK, 0 rows affected (0.00 sec) mysql> EXECUTE stmt7 using @A, @B; Query OK, 1 row affected (0.04 sec) mysql> SET @A = 2, @B = 'Shyam'; Query OK, 0 rows affected (0.00 sec) mysql> EXECUTE stmt7 using @A, @B; Query OK, 1 row affected (0.08 sec) mysql> SET @A = 3, @B = 'Mohan'; Query OK, 0 rows affected (0.00 sec)
마지막으로 SELECT 문으로 확인해 보면 세 개의 행이 정상적으로 삽입된 것을 알 수 있습니다.
mysql> Select * from Student; +------+-------+ | Id | Name | +------+-------+ | 1 | Ram | | 2 | Shyam | | 3 | Mohan | +------+-------+ 3 rows in set (0.00 sec)
이처럼 프리페어드 스테이트먼트는 동일한 쿼리를 여러 번 실행할 때 성능상 이점이 있으며, 값을 직접 문자열에 넣지 않고 파라미터로 전달하기 때문에 SQL 인젝션과 같은 보안 위험을 줄이는 데도 도움이 됩니다.