MySQL2016.05.19 00:40

 

제어문은 스토어드 프로그램의 BEGIN… END 블록 내부에서만 사용될 수 있다.

   

IF … ELSEIF … ELSE … END IF

DELIMITER ;;
 

DROP FUNCTION IF EXISTS sf_greatest;;


CREATE FUNCTION sf_greatest(p_value1 INT, p_value2 INT)
RETURNS INT
BEGIN
IF p_value1 IS NULL THEN
RETURN p_value2;
ELSEIF p_value2 IS NULL THEN
RETURN p_value1;
ELSEIF p_value1 >= p_value2 THEN
RETURN p_value1;
ELSE
RETURN p_value2;
END IF;
END;;

DELIMITER ;

※ END IF 뒤에는 문장의 종료 표시(;)가 필요하다.

   

CASE WHEN … TEHN … ELSE … END CASE

DELIMITER ;;

DROP FUNCTION IF EXISTS sf_greatest1;;

CREATE FUNCTION sf_greatest1(p_value1 INT, p_value2 INT)
RETURNS INT
BEGIN
CASE WHEN p_value1 IS NULL THEN
RETURN p_value2;
WHEN p_value2 IS NULL THEN
RETURN p_value1;
WHEN p_value1 >= p_value2 THEN
RETURN p_value1;
ELSE
RETURN p_value2;
END CASE;
END

DELIMITER ;

※ CASE WHEN 구문도 END CASE로 종료하며 마지막에 문장 종료 표시(;)가 필요하다.

   

반복 루프

1. LOOP

- 반복 비교 조건이 없고 무한 루프를 실행한다는 점에 주의해야 한다.

- LOOP를 벗어나고자 할 때는 LEAVE 명령을 사용한다.

DELIMITER ;;

DROP FUNCTION IF EXISTS sf_factorial1;;

CREATE FUNCTION sf_factorial1 (p_max INT)
RETURNS INT
 

BEGIN

DECLARE v_factorial INT DEFAULT 1;

   

factorial_loop : LOOP

SET v_factorial = v_factorial * p_max;

SET p_max = p_max - 1;

IF p_max <= 1 THEN

LEAVE factorial_loop;

END IF;

END LOOP;

RETURN v_factorial;

END;;

DELIMITER ;

   

2. REPEAT

- 일단 반복 처리 내용을 실행한 다음, 반복 처리를 실행할지 멈출지를 판단

- UNTIL의 조건 식을 비교해 조건 값이 FALSE인 동안 루프 실행

DELIMITER ;;

DROP FUNCTION IF EXISTS sf_factorial2;;
CREATE FUNCTION sf_factorial2 (p_max INT)
RETURNS INT
BEGIN
DECLARE v_factorial INT DEFAULT 1;
REPEAT
SET v_factorial = v_factorial * p_max;
SET p_max = p_max - 1;
UNTIL p_max <= 1
END REPEAT;
 

RETURN v_factorial;
END;;

DELIMITER ;

   

3. WHILE

- 조건 식이 TRUE인 동안 반복해서 실행 한다.

DELIMITER ;;

DROP FUNCTION IF EXISTS sf_factorial3;;
CREATE FUNCTION sf_factorial3(p_max INT)
RETURNS INT
BEGIN

DECLARE v_factorial INT DEFAULT 1;
 

WHILE p_max > 1 DO
SET v_factorial = v_factorial * p_max;
SET p_max = p_max - 1;

END WHILE;

   

RETURN v_factorial;

END;;
DELIMITER ;

 

신고

'MySQL' 카테고리의 다른 글

Can't connect to local MySQL server through socket '/tmp/mysql.sock'  (1) 2016.05.19
[Mysql] 변수  (0) 2016.05.19
[Mysql] 제어문  (0) 2016.05.19
[Mysql] 스토어드 함수  (0) 2016.05.17
[Mysql] 스토어드 프로시저  (0) 2016.05.17
[Mysql] 실행계획2  (1) 2015.05.15
Posted by TM ~ing
MySQL2016.05.17 17:16

 

[함수 생성 및 삭제]

   

DELIMITER ;;
CREATE FUNCTION sf_sum(param1 INTEGER, param2 INTEGER)
RETURNS INTEGER
BEGIN
DECLARE param3 INTEGER DEFAULT 0;
SET param3 = param1 + param2;
RETURN param3;
END;;
DELIMITER ;

※ 프로시저와는 다르게 IN이나 OUT, INOUT 형식 지정을 할 수 없다. RETURNS 키워드를 이용해 반환 되는 값의 타입 명시 해야 함. 또한 함수 본문 마지막에 정의부에 지정된 타입과 동일한 타입의 값을 RETURN 명령으로 반환해야 한다.

   

※프로시저와 다른 점

1. PREPARE와 EXECUTE 명령을 이용한 프리페어 스테이트먼트를 사용할 수 없다.

2. 명시적 또는 묵시적인 ROLLBACK/COMMIT을 유발하는 SQL 문장을 사용할 수 없다.

3. 재귀 호출을 사용할 수 없다.

4. 스토어드 함수 내에서 프로시저를 호출할 수 없다.

5. 결과 셋을 반환하는 SQL 문장을 사용할 수 없다.

   

[함수 실행]

   

SELECT sf_sum(1,2) as sum;
 

  

 

신고

'MySQL' 카테고리의 다른 글

[Mysql] 변수  (0) 2016.05.19
[Mysql] 제어문  (0) 2016.05.19
[Mysql] 스토어드 함수  (0) 2016.05.17
[Mysql] 스토어드 프로시저  (0) 2016.05.17
[Mysql] 실행계획2  (1) 2015.05.15
[Mysql] 실행계획  (0) 2015.05.11
Posted by TM ~ing
MySQL2016.05.17 14:42

 

[프로시저 생성]

   

DELIMITER ;;

CREATE PROCEDURE sp_sum(IN i_param1 INTEGER, IN i_param2 INTEGER, OUT o_param3 INTEGER)

BEGIN

SET o_param3 = i_param1 + i_param2;

END;;

   

DELIMITER ;

   

※ MSSQL과는 다르게 파라미터나 프로시저의 처리 내용을 변경할 때는 ALTER PROCEDURE 명령어를 사용하지 못한다. 이때는 DROP PROCEDURE로 먼저 sp를 삭제하고 생성해야 한다.

   

[프로시저 실행]

   

SET @result := 0;

SELECT @result;

   

CALL sp_sum(1,2,@result);

SELECT @result;

   

※ 프로시저는 CALL 명령어로 실행 한다. IN 타입의 파라미터는 세션 변수 또는 상수 값을 그대로 전달해도 무방하지만, OUT이나 INOUT 타입의 파라미터는 세션 변수를 이용해 값을 주고 받아야 한다.

   

[스토어드 프로시저의 커서 반환]

   

DELIMITER ;;
CREATE PROCEDURE sp_selectEmployees (IN i_empno INTEGER)
BEGIN
SELECT * FROM employees WHERE emp_no=i_empno;
END;;
 

  

   

※ sp에서 쿼리의 결과 셋을 클라이언트로 전송하는 기능은 SP의 디버깅 용도로도 자주 사용한다.

예)

   

DELIMITER ;;

CREATE PROCEDURE sp_sum( IN i_param1 INTEGER, IN i_param2 INTEGER, OUT o_param3 INTEGER)

BEGIN

SELECT '> Stored procedure started.' AS debug_message;

SELECT CONCAT(' > i_param1 : ', i_param1) AS debug_message;

SELECT CONCAT(' > i_param2 : ', i_param2) AS debug_message;

SET o_param3 = i_param1 + i_param2;

SELECT '> Stored procedure completed.' AS debug_message;

END;;

DELIMITER ;

   

SET @result := 0;

CALL sp_sum(1,2, @result);

   

  

 

신고

'MySQL' 카테고리의 다른 글

[Mysql] 변수  (0) 2016.05.19
[Mysql] 제어문  (0) 2016.05.19
[Mysql] 스토어드 함수  (0) 2016.05.17
[Mysql] 스토어드 프로시저  (0) 2016.05.17
[Mysql] 실행계획2  (1) 2015.05.15
[Mysql] 실행계획  (0) 2015.05.11
Posted by TM ~ing

티스토리 툴바