20.1 Stored Programs 정의
각 저장 프로그램은 SQL 문으로 구성된 본체가 포함됩니다. 이 문은 세미콜론 ( ;
) 문자로 구분 된 여러 개의 문으로 구성된 복합 문의 경우가 있습니다. 예를 들어, 다음 저장 프로 시저에 SET
문 및 REPEAT
루프 (루프 자체에 다른 SET
문을 포함합니다)을 포함 BEGIN ... END
블록으로 구성된 본체가 있습니다.
CREATE PROCEDURE dorepeat(p1 INT) BEGIN SET @x = 0; REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; END;
mysql 클라이언트 프로그램을 사용하여 세미콜론 문자를 포함 저장된 프로그램을 정의 할 때 문제가 발생합니다. 기본적으로 mysql 자체는 세미콜론 문 구분자로 인식합니다. 따라서 mysql이 저장 프로그램 정의 전체를 서버에 전달하도록 구분 기호를 일시적으로 다시 정의해야합니다.
mysql 구분 기호를 다시 정의하려면 delimiter
명령을 사용합니다. 다음의 예는 위의 dorepeat()
프로 시저에 대해 이렇게하는 방법을 보여줍니다. 단락 문자는 //
로 변경되어 정의 전체를 하나의 문으로 서버에 전달하여 프로 시저를 호출하기 전에 ;
에 복원 할 수 있습니다. 그러면 프로 시저 본문에서 사용되는 ;
구분자를 mysql 자체가 해석하는 것이 아니라 서버에 전달할 수 있습니다.
mysql>delimiter //
mysql>CREATE PROCEDURE dorepeat(p1 INT)
->BEGIN
->SET @x = 0;
->REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
->END
->//
Query OK, 0 rows affected (0.00 sec) mysql>delimiter ;
mysql>CALL dorepeat(1000);
Query OK, 0 rows affected (0.00 sec) mysql>SELECT @x;
+------+ | @x | +------+ | 1001 | +------+ 1 row in set (0.00 sec)
구분자를 //
이외의 문자열에 다시 정의 할 수 구분자는 단일 문자로 구성 할 수도 있고, 여러 문자로 구성 할 수 있습니다. 백 슬래시 ( " \
") 문자는 MySQL의 이스케이프 문자이므로 사용하지 마십시오.
다음 매개 변수를 받아 SQL 함수를 사용하여 작업을 수행 한 후 결과를 반환하는 함수를 보여줍니다. 이 경우 함수 정의 내부의 ;
문 구분자가 포함되어 있지 않기 때문에, delimiter
를 사용할 필요가 없습니다.
mysql>CREATE FUNCTION hello (s CHAR(20))
mysql>RETURNS CHAR(50) DETERMINISTIC
->RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec) mysql>SELECT hello('world');
+----------------+ | hello('world') | +----------------+ | Hello, world! | +----------------+ 1 row in set (0.00 sec)