13.6.4.2 로컬 변수의 범위 해결
로컬 변수의 범위는 그것이 선언 된 BEGIN ... END
블록입니다. 이 변수는 같은 이름을 가진 변수를 선언하고있는 블록을 제외하고 선언 블록 내에서 중첩 된 블록 내에서 볼 수 있습니다.
로컬 변수는 저장 프로그램 실행 중에 만 범위 내에 있으므로 이러한 참조는 저장 프로그램에서 생성 된 준비된 명령문은 허용되지 않습니다. 준비된 명령문의 범위는 현재의 세션이며, 저장 프로그램이 아니기 때문에 문은 프로그램의 종료 후에 수행 할 수 있으며 이때 변수는 범위 내에 존재하지 않습니다. 예를 들어, SELECT ... INTO
는 준비된 명령문으로 사용할 수 없습니다. 이 제약은 저장 프로 시저 및 저장 함수의 매개 변수에 적용됩니다. 섹션 13.5.1 "PREPARE 구문" 을 참조하십시오. local_var
로컬 변수 테이블 컬럼과 동일한 이름으로는 안됩니다. SELECT ... INTO
문 등의 SQL 문에 컬럼 및 동일한 이름을 가진 선언 된 로컬 변수에 대한 참조가 포함되어있는 경우, MySQL은 현재 그 참조를 변수의 이름으로 해석합니다. 다음 프로 시저 정의를 생각해 보겠습니다.
CREATE PROCEDURE sp1 (x VARCHAR (5)) BEGIN DECLARE xname VARCHAR (5) DEFAULT 'bob'; DECLARE newname VARCHAR (5); DECLARE xid INT; SELECT xname, id INTO newname, xid FROM table1 WHERE xname = xname; SELECT newname; END;
MySQL은 SELECT
문에 xname
을 xname
컬럼 대신 xname
변수에 대한 참조로 해석합니다. 그 결과, 프로 시저 sp1()
가 호출되면 table1.xname
컬럼의 값에 관계없이 newname
변수는 값 'bob'
를 반환합니다.
마찬가지로 다음 프로 시저에서 커서 정의에 xname
을 참조하는 SELECT
문이 포함되어 있습니다. MySQL은 이것을 컬럼 참조가 아니라 그 이름의 변수에 대한 참조로 해석합니다.
CREATE PROCEDURE sp2 (x VARCHAR (5)) BEGIN DECLARE xname VARCHAR (5) DEFAULT 'bob'; DECLARE newname VARCHAR (5); DECLARE xid INT; DECLARE done TINYINT DEFAULT 0; DECLARE cur1 CURSOR FOR SELECT xname, id FROM table1; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur1; read_loop : LOOP FETCH FROM cur1 INTO newname, xid; IF done THEN LEAVE read_loop; END IF; SELECT newname; END LOOP; CLOSE cur1; END;
섹션 D.1 "저장 프로그램 제한 사항" 을 참조하십시오.