1. 프로시져 호출
CALL 프로시져명();
2. 함수 호출
SELECT 함수명();
DELIMITER $$
USE `프로시져 생성할 DB명`$$
DROP PROCEDURE IF EXISTS `프로시져명`$$
CREATE DEFINER=`생성자` PROCEDURE `프로시져명`(변수명 변수타입,변수명 변수타입 .......)
MODIFIES SQL DATA
COMMENT '프로시져 설명'
BEGIN
DECLARE 변수명 변수 타입;
-- 프로시져 내용
SELECT .... FROM TB_NAME;
END$$
DELIMITER ;
1. 주위사항
: DEFINER 는 생성자의 정보를 담고 있으며 해당 계정 및 아이피가 해당 서버의 정보로 설정됨
: 생성자가 다른 유저나 아이피에서 해당 PROCEDURE & FUNCTION 을 생성할경우 실행 에러 발생함
: DEFINER 생략 가능
참고 : http://dev.mysql.com/doc/refman/5.0/en/CREATE-procedure.html
DELIMITER $$
USE `member`$$
DROP PROCEDURE IF EXISTS `p_exsample_sel`$$
CREATE PROCEDURE `p_exsample_sel`()
MODIFIES SQL DATA
COMMENT '단일 쿼리 프로시져'
BEGIN
SELECT useno,userid,title FROM TB_NAME;
END$$
DELIMITER ;
DELIMITER $$
USE `member`$$
DROP PROCEDURE IF EXISTS `p_exsample_sel`$$
CREATE PROCEDURE `p_exsample_sel`()
MODIFIES SQL DATA
COMMENT '멀티 쿼리 프로시져'
BEGIN
SELECT COUNT(*) cnt FROM TB_NAME;
SELECT useno,userid,title FROM TB_NAME;
END$$
DELIMITER ;
=> 하나의 Array 2개가 result 넘어옴
DELIMITER $$
USE `member`$$
DROP PROCEDURE IF EXISTS `p_exsample_sel`$$
CREATE PROCEDURE `p_exsample_sel`()
MODIFIES SQL DATA
COMMENT '내부 검사형 프로시져'
BEGIN
DECLARE s_cnt INT DEFAULT 0;
SELECT COUNT(*) INTO s_cnt FROM TB_NAME;
IF s_cnt>0 THEN
SELECT useno,userid,title FROM TB_NAME;
END IF;
END$$
DELIMITER ;
=> SELECT useno,userid,title FROM TB_NAME 에 대한 하나의 result만 넘어옴
DELIMITER $$
USE `member`$$
DROP PROCEDURE IF EXISTS `p_exsample_sel`$$
CREATE PROCEDURE `p_exsample_sel`(userno INT)
MODIFIES SQL DATA
COMMENT '내부 검사형 프로시져'
BEGIN
DECLARE s_cnt INT DEFAULT 0;
DECLARE s_sql VARCHAR(255) DEFAULT '';
SELECT COUNT(*) INTO s_cnt FROM TB_NAME;
IF s_cnt>0 THEN
SET s_sql = CONCAT(" WHERE userno=",userno);
SET @stmt = CONCAT("SELECT COUNT(*) AS cnt FROM TB_NAME B ",s_sql);
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DROP PREPARE stmt;
END IF;
END$$
DELIMITER ;
=> userno 변수값을 받아서 STRING 을 SQL로 실행하기 위한 STMT 방식
DELIMITER $$
USE `c_backup`$$
DROP FUNCTION IF EXISTS `f_func_sel`$$
CREATE FUNCTION `f_func_sel`(ssn VARCHAR(14)) RETURNS INT
NO SQL
COMMENT '일반 리턴형 함수'
BEGIN
DECLARE s_cnt INT DEFAULT 0;
SELECT COUNT(*) INTO s_cnt FROM TB_NAME;
IF s_cnt>0 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END$$
DELIMITER ;
DELIMITER $$
USE `c_backup`$$
DROP FUNCTION IF EXISTS `f_func_sel`$$
CREATE FUNCTION `f_func_sel`(ssn VARCHAR(14)) RETURNS VARCHAR(10)
NO SQL
COMMENT '일반 리턴형 함수'
BEGIN
DECLARE s_cnt INT DEFAULT 0;
DECLARE s_return VARCHAR(10) DEFAULT '';
SELECT COUNT(*) INTO s_cnt FROM TB_NAME;
IF s_cnt>0 THEN
SET s_return = CONCAT("개수 있음 : ",s_cnt);
ELSE
SET s_return = CONCAT("개수 없음 : ",s_cnt);
END IF;
RETURN s_return;
END$$
DELIMITER ;
# mysql 내부에서 사용하실때 구문
IF 조건절 THEN
SELECT userno FROM TB_NAME;
ELSE
SELECT userid FROM TB_NAME;
END IF;
IF 조건절 THEN
ELSEIF 조건절 THEN
ELSE
END IF;
CASE WHEN 조건절 THEN
값
WHEN 조건절 THEN
값
ELSE
값
END CASE;