Stored Procedure (프로시저)
2022. 4. 25. 11:29ㆍDataBase
프로시저
어떠한 동작을 일괄 처리하기 위한 용도이다. 쿼리문 처리를 할 때 바로 처리하지 않고 값을 받아와 프로시저 내부에서 일괄적으로 처리한 후 결과를 내보내 주기 위한 루틴이다.
프로시저의 특징
자주 사용되는 일반적인 쿼리를 모듈화 시켜 필요할 때만 호출하면 편리하다.
내가 필요한 만큼 응용해서 사용할 수 있기 때문에 MySQL 운영에 편리하다.
프로시저의 단점
· 유지 보수 복잡성 증가
각 기능을 담당하는 프로그램 코드가 자바와 MySQL 스토어드 프로그램으로 분산되어 관리하기 때문에 애플리케이션의 설치나 배포가 더 복잡해진다. 사용자가 감당할 수 있는 부분에 관하여 적절하게 사용해야 한다.
프로시저 형식의 정의
· 프로시저 문법
$$ $$ : 괄호 개념으로 내부 부분이 프로시저 이다.
call 프로시저이름(변수); : 정의했던 프로시저의 일련작업들이 수행된다.
프로시저 실습
이름 : sp_search_member
코멘트 : 회원의 이름을 입력받아 회원의 정보를 조회하는 프로시저
BEGIN
select
m.*
from
tb_member as m
where
m.m_name like concat('%', mName, '%');
END
CALL sp_search_member('홍1');
실습1
실습2
실습3
BEGIN
/* 변수를 선언 declare변수명 데이터타입(길이)*/
/* private int memberLevel */
declare memberLevel int;
/* memberLevel =0; */
set memberLevel := 0;
/* int memberLevel =0; 선언과 동시에 초기화 */
/* declare memberLevel int defaut 0; */
select
m.m_level into memberLevel
from
tb_member as m
where
m.m_id = memberid;
/* PL/SQL IF조건문 */
if (memberLevel = 1) then
select '관리자' as '권한';
elseif (memberid = 2) then
select '판매자' as '권한';
elseif (memberLevel =3) then
select '구매자' as '권한';
else
select '일반회원' as '권한';
end if;
END
실습4
BEGIN
/* 변수를 선언 DECLARE 변수명 데이터타입(길이)*/
/* private int memberLevel*/
/* DECLARE memberLevel int; */
/* memberLevel = 0;*/
/* SET memberLevel := 0; */
/* int memberLevel = 0;*/
/* 변수 선언과 초기화 */
DECLARE memberLevel int DEFAULT 0;
SELECT
m.m_level into memberLevel
FROM
tb_member as m
WHERE
m.m_id = memberId;
/* PL/SQL CASE 조건문 */
CASE
WHEN (memberLevel = 1) THEN
SELECT '관리자' AS '권한';
WHEN (memberLevel = 2) THEN
SELECT '판매자' AS '권한';
WHEN (memberLevel = 3) THEN
SELECT '구매자' AS '권한';
ELSE
SELECT '일반회원' AS '권한';
END CASE;
END
실습5
BEGIN
/* 변수 선언 초기화 */
declare totalSum INT DEFAULT 0;
/* 변수 증가값 */
declare i INT DEFAULT 0;
/* PL/ SQL WHILE문 */
while ( i < intValue) do
set i := i+1;
set totalSum := totalSum + i;
end while;
select totalSum as '총합계';
END
실습6
실습7. loop
BEGIN
/* 변수 선언 및 초기화 */
declare totalSum int default 0;
/* 반복문 사용할 변수 증가값 */
declare i int default 0;
loop_sum : loop
/* for break */
if(i = intValue) then
leave loop_sum;
end if;
set i := i+1;
set totalSum := totalSum + i;
end loop;
select totalSum as '총합계';
END
실습8. loop2
BEGIN
/* 변수 선언*/
declare totalSum int;
/* 반복문 증가변수 선언 및 초기화 */
declare i int default 0;
/* 변수 초기화 및 할당 */
set totalSum := 0;
loop_sum : loop
if (i = intValue) then
leave loop_sum;
end if;
set i := i+1;
if ( i <> 2) then
set totalSum := totalSum + i;
end if;
end loop;
select totalSum as '2를 제외한 총합계';
END
실습9
BEGIN
/* 구구단 식*/
DECLARE timesVar VARCHAR(10);
/* 증가변수 */
DECLARE i INT DEFAULT 0;
/* 구구단의 결과 값 */
DECLARE result_times INT;
/* 테이블이 있다면 테이블을 삭제 */
DROP TABLE IF EXISTS tb_times;
/* 테이블 생성*/
CREATE TABLE IF NOT EXISTS tb_times(
times VARCHAR(10) NOT NULL COMMENT '단'
,result INT COMMENT '결과값'
);
/* 구구단*/
loop_times : LOOP
IF (i = 9) THEN
LEAVE loop_times;
END IF;
SET i := i + 1;
SET timesVar := CONCAT(intValue, ' X ', i);
SET result_times := intValue * i;
INSERT INTO tb_times
(times, result)
VALUES
(timesVar, result_times);
END LOOP;
SELECT * FROM tb_times;
END
loop에서 무한루프 걸릴 경우, 윈도우 -> 서비스 -> MYSQL -> 중지 누르고 다시 시도!
1. 프로시저 실습
BEGIN
declare resultTimes text;
declare i int;
declare k int;
if (intValue < 2 ) then
select '2이상의 값을 입력해주세요';
else
drop table if exists tb_gugu;
create table if not exists tb_gugu(
result TEXT COMMENT '구구단 결과'
);
set i := 2;
while ( i <= intValue ) do
set resultTimes :='';
set k := 1;
while ( k < 10 ) do
if ( (i*k) <10 ) then
set resultTimes := concat(resultTimes, ' ', i, 'X', k, '=0', (i*k));
else
set resultTimes := concat(resultTimes, ' ', i, 'X', k, '=', (i*k));
end if;
set k := k + 1;
end while;
INSERT INTO tb_gugu(result) values (resultTimes);
set i := i + 1;
end while;
select * from tb_gugu;
end if;
END
2. 프로시저 실습
BEGIN
DECLARE divisors TEXT DEFAULT '';
DECLARE totalDivisor INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
WHILE ( i <= intValue) DO
IF ((intValue % i) = 0) THEN
IF(i=1) THEN
SET divisors := '1';
ELSE
SET divisors := CONCAT(divisors, ', ', i);
END IF;
SET totalDivisor := totalDivisor + i;
END IF;
SET i := i + 1;
END WHILE;
SELECT divisors AS '약수', totalDivisor AS '약수들의 합';
END
'DataBase' 카테고리의 다른 글
Stored trigger (트리거) (0) | 2022.04.26 |
---|---|
Stored Function (함수) - 사용자 정의 함수 (0) | 2022.04.26 |
데이터베이스 part4 - 정규화, 서브쿼리(Sub Query), UNION, SQL 실습 (0) | 2022.04.25 |
데이터베이스 part3 - JOIN, 데이터베이스 설계, SQL 실습 (0) | 2022.04.24 |
데이터베이스 part2 - MYSQL 완전 삭제, 데이터 모델링, 관계형 데이터 모델(릴레이션 특성, 키의 종류), MySQL 데이터 타입, SQL (0) | 2022.04.24 |