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

MySQL 저장 프로시저에서 SHOW CREATE TABLE 실행하기

MySQL에서 SHOW CREATE TABLE 문은 특정 테이블의 생성 구문(DDL)을 확인할 때 유용하게 사용됩니다. 그러나 저장 프로시저 내부에서는 SHOW 문을 직접 실행할 수 없기 때문에, PREPAREEXECUTE를 활용한 동적 쿼리(dynamic query) 방식으로 처리해야 합니다. 이번 글에서는 그 과정을 단계별로 살펴보겠습니다.

1. 예제용 테이블 생성

먼저 실습에 사용할 테이블을 생성합니다.

mysql> create table DemoTable2011
   -> (
   -> StudentId int NOT NULL AUTO_INCREMENT,
   -> StudentName varchar(20),
   -> StudentAge int,
   -> StudentCountryName varchar(20),
   -> PRIMARY KEY(StudentId)
   -> );
Query OK, 0 rows affected (0.80 sec)

2. SHOW CREATE TABLE을 실행하는 저장 프로시저 작성

다음은 테이블 이름을 파라미터로 받아 SHOW CREATE TABLE 결과를 반환하는 저장 프로시저입니다. CONCAT 함수로 쿼리 문자열을 조립한 뒤, PREPARE와 EXECUTE로 실행하는 구조입니다.

mysql> delimiter //
mysql> create procedure test_show_create_demo(table_name varchar(100))
   -> begin
   -> set @query=concat("SHOW CREATE TABLE ",table_name);
   -> prepare st from @query;
   -> execute st;
   -> end
   -> //
Query OK, 0 rows affected (0.22 sec)

mysql> delimiter ;

동작 원리

  • CONCAT(): 전달받은 테이블 이름을 조합하여 "SHOW CREATE TABLE ..." 형태의 쿼리 문자열을 만듭니다.
  • PREPARE: 문자열 형태의 쿼리를 실행 가능한 준비된 상태(prepared statement)로 변환합니다.
  • EXECUTE: 준비된 쿼리를 실제로 실행하고 결과를 출력합니다.

3. 저장 프로시저 호출

CALL 명령어를 사용하여 저장 프로시저를 호출합니다. 이때 확인하고자 하는 테이블 이름을 인수로 전달합니다.

mysql> call test_show_create_demo('DemoTable2011');

4. 실행 결과

프로시저를 호출하면 해당 테이블의 CREATE TABLE 구문이 다음과 같이 출력됩니다.

+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
|
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DemoTable2011 | CREATE TABLE `demotable2011` (
   `StudentId` int(11) NOT NULL AUTO_INCREMENT,
   `StudentName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
   `StudentAge` int(11) DEFAULT NULL,
   `StudentCountryName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
   PRIMARY KEY (`StudentId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

Query OK, 0 rows affected, 1 warning (0.06 sec)

이처럼 저장 프로시저와 동적 쿼리를 활용하면, 테이블 이름만 파라미터로 넘겨주면 되므로 여러 테이블의 DDL 정보를 반복적으로 조회할 때 매우 편리합니다. 참고로 운영 환경에서는 SQL 주입 위험을 고려하여 입력값 검증을 함께 적용하는 것이 좋습니다.