MySQL에서 사용되는 프로시저(저장 프로시저)에 대해 정리 해보자.
// 프로시저 생성 및 수정 권한 주기
GRANT CREATE, ALTER ROUTINE ON DB명.* TO 'user_id';
FLUSH PRIVILEGES;
// 특정 프로시저 실행 권한 주기
GRANT EXECUTE ON PROCEDURE db_name.procedure_name TO 'user_id'@'host' ;
FLUSH PRIVILEGES;
CREATE DEFINER=`DB아이디`@`%` PROCEDURE `프로시저명`
BEGIN
SELECT *
FROM 테이블명
END
DB에 접속하는 ID명을 적어준다.
여기서 ID는 권한이 있는 ID를 적어야 한다.
CREATE DEFINER=`DB아이디`@`%` PROCEDURE `프로시저명`(
IN 변수명 자료형 // 들어오는 변수
OUT 변수명 자료형 // 반환 변수
)
BEGIN
SELECT *
FROM 테이블명
WHERE 컬럼명 = 변수명
END
받을 변수명과 자료형 (INT, VARCHAR(40) 등)을 입력해준다. 받을때는 IN 을 사용
CREATE DEFINER=`DB아이디`@`%` PROCEDURE `프로시저명`(
IN 변수명 자료형
)
BEGIN
SET @v_code = '123'; // 이 부분에서 서브쿼리 사용 가능
SELECT *
FROM 테이블명
WHERE 컬럼 = 변수명 AND
컬럼 = @v_code
END
변수를 할당할때 바로 값을 적어도 되지만 서브쿼리를 사용하여
@v_code = (select 컬럼명 from 테이블 where 조건...)
등으로 할당 할 수 있다.
CREATE DEFINER=`DB아이디`@`%` PROCEDURE `프로시저명`(
IN 변수명 자료형
)
BEGIN
SET @v_code = '123';
IF @v_code!='' THEN
SELECT *
FROM 테이블명
WHERE 컬럼 = 변수명 AND
컬럼 = @v_code
END IF;
END
[IF 절]
IF 조건문 OR 조건문 THEN
실행문구
ELSE IF 조건문 THEN
실행문구
END IF;
등의 형태로 쓸 수 있으며
NULL 체크는 IS NOT NULL / IS NULL 을 쓸 수 있다.
같지 않음은 !=와 <> 둘다 가능
프로시저 생성이 안될땐, 프로시저의 상단에 DELIMITER ;; 혹은 DELIMITER $$ 를 붙여주면 된다.
CREATE DEFINER='root'@'%' PROCEDURE test_prc(id int(10))
BEGIN
SET @t1 = CONCAT('SELECT * FROM test_', id);
PREPARE s FROM @t1;
EXECUTE s;
END
이런 식의 프로시저는 테이블이름을 배열 변수에 담아서 LOOPING 돌려 한번에 처리 가능.