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

MySQL에서 준비된 명령문(PREPARE)의 SQL 결과를 변수에 할당하는 방법

MySQL에서 준비된 명령문(Prepared Statement)의 실행 결과를 변수에 저장해야 하는 경우가 종종 있습니다. 이럴 때 가장 효과적인 방법은 저장 프로시저(Stored Procedure)를 활용하는 것입니다. 이 글에서는 실제 예제를 통해 단계별로 그 과정을 살펴보겠습니다.

1. 예제 테이블 생성

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

mysql> create table DemoTable(Id int, Name varchar(100));
Query OK, 0 rows affected (1.51 sec)

2. 샘플 데이터 삽입

INSERT 명령어를 사용하여 테이블에 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable values(10,'John');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(11,'Chris');
Query OK, 1 row affected (0.41 sec)

3. 데이터 조회

SELECT 문으로 테이블의 모든 레코드가 정상적으로 입력되었는지 확인합니다.

mysql> select *from DemoTable;

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

+------+-------+
| Id   | Name  |
+------+-------+
| 10   | John  |
| 11   | Chris |
+------+-------+
2 rows in set (0.00 sec)

4. 저장 프로시저 생성하기

이제 준비된 명령문의 SQL 결과를 변수에 할당하는 핵심 쿼리입니다. 동적 SQL을 구성한 뒤 PREPARE, EXECUTE, DEALLOCATE PREPARE 순서로 처리합니다.

mysql> DELIMITER //
mysql> CREATE PROCEDURE Prepared_Statement_Demo( nameOfTable VARCHAR(20), IN nameOfColumn VARCHAR(20), IN idColumnName INT)
BEGIN
    SET @holdResult=CONCAT('SELECT ', nameOfColumn, ' INTO @value FROM ', nameOfTable, ' WHERE id = ', idColumnName);
       PREPARE st FROM @holdResult;
       EXECUTE st;
       DEALLOCATE PREPARE st;
   END //
Query OK, 0 rows affected (0.20 sec)
mysql> DELIMITER ;

위 프로시저는 세 가지 매개변수를 받습니다.

  • nameOfTable: 데이터를 조회할 테이블 이름
  • nameOfColumn: 값을 가져올 컬럼 이름
  • idColumnName: WHERE 조건에 사용할 id 값

CONCAT() 함수로 SELECT ... INTO @value 형태의 동적 쿼리 문자열을 만들고, 이를 준비된 명령문으로 실행하여 결과를 세션 변수 @value에 저장하는 구조입니다.

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

CALL 명령어로 저장 프로시저를 호출합니다.

mysql> call Prepared_Statement_Demo('DemoTable','Name',10);
Query OK, 0 rows affected, 2 warnings (0.00 sec)

이제 변수 @value에 값이 제대로 할당되었는지 확인해 보겠습니다.

mysql> select @value;

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

+--------+
| @value |
+--------+
| John   |
+--------+
1 row in set (0.00 sec)

마무리

이처럼 저장 프로시저 안에서 PREPAREEXECUTE를 조합하면, 준비된 명령문의 SQL 조회 결과를 손쉽게 변수에 담아 재사용할 수 있습니다. 테이블 이름이나 컬럼 이름을 동적으로 지정해야 하는 상황에서 특히 유용하게 활용할 수 있으니 참고하시기 바랍니다.