Loading...
MySQL 9.5 Reference Manual 9.5의 27.1 Defining Stored Programs의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
각 stored program은 SQL 문으로 구성된 body를 포함합니다. 이 문은 여러 문이 세미콜론(;) 문자로 구분되어 이루어진 복합문일 수 있습니다. 예를 들어, 다음 stored procedure는
BEGIN ... END block으로 이루어진 body를 가지며, 그 안에는
SET
문과 그 자체로 또 다른
SET
문을 포함하는
REPEAT 루프가 들어 있습니다:
1CREATE PROCEDURE dorepeat(p1 INT) 2BEGIN 3 SET @x = 0; 4 REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; 5END;
세미콜론 문자를 포함하는 stored program을 정의하기 위해 mysql 클라이언트 프로그램을 사용하는 경우 문제가 발생합니다. 기본적으로 mysql 자체가 세미콜론을 문 구분 기호로 인식하므로, mysql이 전체 stored program 정의를 서버에 전달하도록 구분 기호를 일시적으로 재정의해야 합니다.
mysql 구분 기호를 재정의하려면 delimiter 명령을 사용합니다.
다음 예제는 바로 앞에 보인 dorepeat() procedure에 대해
이 작업을 수행하는 방법을 보여줍니다. 구분 기호는 전체 정의가
하나의 문으로 서버에 전달될 수 있도록 //로 변경되었다가,
procedure를 호출하기 전에 다시 ;로 복원됩니다. 이는
procedure body에서 사용된 ; 구분 기호가
mysql 자체에 의해 해석되지 않고 서버로 그대로 전달되도록 해 줍니다.
1mysql> delimiter // 2 3mysql> CREATE PROCEDURE dorepeat(p1 INT) 4 -> BEGIN 5 -> SET @x = 0; 6 -> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; 7 -> END 8 -> // 9Query OK, 0 rows affected (0.00 sec) 10 11mysql> delimiter ; 12 13mysql> CALL dorepeat(1000); 14Query OK, 0 rows affected (0.00 sec) 15 16mysql> SELECT @x; 17+------+ 18| @x | 19+------+ 20| 1001 | 21+------+ 221 row in set (0.00 sec)
구분 기호는 // 이외의 문자열로 재정의할 수 있으며,
구분 기호는 하나의 문자 또는 여러 문자로 구성될 수 있습니다.
MySQL에서 역슬래시(\) 문자는 이스케이프 문자이므로 사용을 피해야 합니다.
다음은 매개변수를 받아 SQL 함수를 사용하여 작업을 수행하고
결과를 반환하는 함수의 예입니다. 이 경우 함수 정의에
내부 ; 문 구분 기호가 포함되어 있지 않으므로
delimiter를 사용할 필요가 없습니다:
1mysql> CREATE FUNCTION hello (s CHAR(20)) 2mysql> RETURNS CHAR(50) DETERMINISTIC 3 -> RETURN CONCAT('Hello, ',s,'!'); 4Query OK, 0 rows affected (0.00 sec) 5 6mysql> SELECT hello('world'); 7+----------------+ 8| hello('world') | 9+----------------+ 10| Hello, world! | 11+----------------+ 121 row in set (0.00 sec)
27 Stored Objects
27.2 Using Stored Routines