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

MySQL 저장 프로시저 '변수 또는 NEW 의사 변수가 아닙니다' 오류 해결 방법

오류 원인과 해결 개념

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 의사 변수가 아닙니다' 오류 없이 정상적으로 동작합니다.