오류 원인과 해결 개념
MySQL에서 저장 프로시저(stored procedure)를 호출할 때 'not a variable or NEW pseudo-variable'(변수 또는 NEW 의사 변수가 아닙니다)라는 오류 메시지가 나타나는 경우가 있습니다. 이 오류는 주로 저장 프로시저의 OUT 매개변수에 일반 값이나 상수를 직접 전달하려고 할 때 발생합니다.
이 문제를 해결하는 핵심은 @ 기호가 붙은 사용자 정의 변수를 사용하여 저장 프로시저의 출력 값을 받는 것입니다.
기본 문법
저장 프로시저를 호출할 때 변수를 전달하는 문법은 다음과 같습니다.
CALL yourStoredProcedureName(yourParameter1,yourParameter2,..........N,@yourVariableName);
변수에 저장된 값을 확인하려면 SELECT 문을 사용합니다.
SELECT @yourVariableName;
실습 예제로 확인하기
위 문법을 제대로 이해하기 위해 테이블을 생성하고 샘플 데이터를 삽입한 후 단계별로 살펴보겠습니다.
1단계: 테이블 생성
테이블을 생성하는 쿼리는 다음과 같습니다.
mysql> create table StoredProcedureDemo
-> (
-> Id int,
-> Name varchar(10)
-> );
Query OK, 0 rows affected (1.20 sec)
2단계: 레코드 삽입
INSERT 명령을 사용하여 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into StoredProcedureDemo values(1,'John');
Query OK, 1 row affected (0.31 sec)
mysql> insert into StoredProcedureDemo values(2,'Carol');
Query OK, 1 row affected (0.19 sec)
3단계: 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from StoredProcedureDemo;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 1 | John |
| 2 | Carol |
+------+-------+
2 rows in set (0.00 sec)
4단계: 저장 프로시저 생성
값을 반환하는 저장 프로시저를 만들어 보겠습니다. OUT 매개변수를 통해 메시지를 반환하도록 구성했습니다.
mysql> DELIMITER //
mysql> create procedure Update_table(IN Id int, IN Name VARCHAR(20),OUT message VARCHAR(50))
-> BEGIN
-> set message= 'DATABASE HAS BEEN UPDATED';
-> INSERT INTO StoredProcedureDemo
-> values (Id, Name);
-> end;
-> //
Query OK, 0 rows affected (0.67 sec)
mysql> DELIMITER ;
5단계: 변수와 함께 저장 프로시저 호출
이제 @ 기호가 붙은 변수를 사용하여 저장 프로시저를 호출합니다.
mysql> call Update_table(3,'Larry',@UserMessage);
Query OK, 1 row affected (0.13 sec)
6단계: 변수 값 확인
SELECT 문으로 @UserMessage 변수의 값을 확인합니다.
mysql> select @UserMessage;
실행 결과는 다음과 같습니다.
+---------------------------+
| @UserMessage |
+---------------------------+
| DATABASE HAS BEEN UPDATED |
+---------------------------+
1 row in set (0.00 sec)
7단계: 최종 결과 검증
테이블의 레코드를 다시 한번 조회하여 변경 사항을 확인해 보겠습니다.
mysql> select *from StoredProcedureDemo;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 1 | John |
| 2 | Carol |
| 3 | Larry |
+------+-------+
3 rows in set (0.00 sec)
정리
위 실행 결과를 보면 Id가 3인 새 레코드(Larry)가 성공적으로 삽입된 것을 확인할 수 있습니다. 저장 프로시저의 OUT 매개변수에는 반드시 @ 접두어가 붙은 사용자 정의 변수를 전달해야 하며, 이렇게 하면 '변수 또는 NEW 의사 변수가 아닙니다' 오류 없이 정상적으로 동작합니다.