#기본형식
형식 :
DELIMITER $$
CREATE PROCEDURE 스토어드 프로시저이름(IN 또는 OUT 파라미터)
BEGIN
SQL 프로그램 코딩
END $$
DELIMITER;
CALL 스토어드 프로시저이름();
#예시
DELIMITER $$
CREATE PROCEDURE userProc()
BEGIN
SELECT * FROM userTbl; -- 스토어드 프로시저 내용
END $$
DELIMITER;
CALL userProc();
#출력매개변수 설정
-- 스토어드 프로시저 생성 및 테스트로 사용할 테이블 생성
DELiMITER $$
CREATE PRocedure userProc3(
In txtValue Char(10),
out outvalue int
)
Begin
insert into testTbl values(null, txtvalue);
select max(id) into outvalue from testTbl;
End $$
DELIMITER ;
-- 테스트 테이블 생성 후
CREATE table if not exists testTbl(
id int Auto_increment primary key,
txt char(10)
);
-- 매개변수로 호출하여 실행한다.
call userProc3('테스트값', @myValue);
-- concat을 이용하여 이어 붙인다.
select concat('현재 입력된 ID 값 ==>', @myValue);
#출력매개변수 설정
-- 스토어드 프로시저 생성 및 테스트로 사용할 테이블 생성
DELiMITER $$
CREATE PRocedure userProc3(
In txtValue Char(10),
out outvalue int
)
Begin
insert into testTbl values(null, txtvalue);
select max(id) into outvalue from testTbl;
End $$
DELIMITER ;
-- 테스트 테이블 생성 후
CREATE table if not exists testTbl(
id int Auto_increment primary key,
txt char(10)
);
-- 매개변수로 호출하여 실행한다.
call userProc3('테스트값', @myValue);
-- concat을 이용하여 이어 붙인다.
select concat('현재 입력된 ID 값 ==>', @myValue);
DELIMITER $$
CREATE PROCEDURE ifelseProc(
IN userName VARCHAR(10)
)
BEGIN
DECLARE bYear INT; -- 변수 선언
SELECT birthYear into bYear FROM userTBL
WHERE name = userName;
IF (byear >= 1980 ) THEN
SELECT '아직 젊군요..';
ELSE
SELECT '나이가 많네';
END IF;
END $$
DELIMITER ;
CALL ifelseProc('조용필');
DELIMITER $$
CREATE PROCEDURE caseProc(
IN userName VARCHAR(10)
)
BEGIN
DECLARE bYear INT;
DECLARE tti CHAR(3); -- 띠
SELECT birthYear INTO byear from usertbl
where name = userName;
CASE
WHEN (byear%12 = 0) THEN SET tti = '원숭이';
WHEN (byear%12 = 1) THEN SET tti = '닭';
WHEN (byear%12 = 2) THEN SET tti = '개';
WHEN (byear%12 = 3) THEN SET tti = '돼지';
WHEN (byear%12 = 4) THEN SET tti = '쥐';
WHEN (byear%12 = 5) THEN SET tti = '소';
WHEN (byear%12 = 6) THEN SET tti = '호랑이';
WHEN (byear%12 = 7) THEN SET tti = '토끼';
WHEN (byear%12 = 8) THEN SET tti = '용';
WHEN (byear%12 = 9) THEN SET tti = '뱀';
WHEN (byear%12 = 10) THEN SET tti = '말';
ELSE SET tti = '양';
END CASE;
SELECT CONCAT(username, '의 띄 ==>', tti);
END $$
DELIMITER ;
CALL caseProc('김범수');
DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
DECLARE str VARCHAR(100); -- 각 단을 문자열로 저장
DECLARE i INT; -- 구구단 앞자리
DECLARE k INT; -- 구구단 뒷자리
SET i = 2; -- 2단부터 계산
WHILE (i < 10) DO -- 바깥 반복문. 2단~9단까지.
SET str = ''; -- 각 단의 결과를 저장할 문자열 초기화
SET k = 1; -- 구구단 뒷자리는 항상 1부터 9까지.
WHILE (k < 10) DO
SET str = CONCAT(str, ' ', i, 'x', k, '=', i*k); -- 문자열 만들기
SET k = k + 1; -- 뒷자리 증가
END WHILE;
SET i = i + 1; -- 앞자리 증가
INSERT INTO guguTBL VALUES(str); -- 각 단의 결과를 테이블에 입력.
END WHILE;
END $$
DELIMITER ;
CALL whileProc();
SELECT * FROM guguTBL;
-- 현재 저장된 프로시저의 이름 및 내용 확인
SELECT routine_name, routine_definition FROM INFORMATION_SCHEMA.ROUTINES
WHERE routine_schema = 'tabledb' AND routine_type = 'PROCEDURE';
-- 파라미터 확인
SELECT parameter_mode, parameter_name, dtd_identifier
FROM INFORMATION_SCHEMA.PARAMETERS
WHERE specific_name = 'userProc3';
사용자가 직접 만들어서 사용하는 함수
스토어드 프로시저와 유사 (형태와 사용 용도에 있어 차이 있음)
2개의 숫자의 합계를 계산하는 스토어드 함수
SET global log_bin_trust_function_creators = 1; -- 함수 생성 권한 허용
USE sqlDB;
DROP FUNCTION IF EXISTS userFunc;
DELIMITER $$
CREATE FUNCTION userFunc(value1 INT, value2 INT)
RETURNS INT
BEGIN
RETURN value1 + value2;
END $$
DELIMITER ;
SELECT userFunc(100, 200);
DROP FUNCTION IF EXISTS getAgeFunc;
DELIMITER $$
CREATE FUNCTION getAgeFunc(bYear INT)
RETURNS INT
BEGIN
DECLARE age INT;
SET age = YEAR(CURDATE()) - bYear; -- 현재 년도에서 입력받은 년도를 빼준것을 age에 초기화
RETURN age; -- age 리턴
END $$
DELIMITER ;
SELECT getAgeFunc(1979);