DB

스토어드 프로시저

sdafdq 2023. 11. 6. 10:20

스토어드 프로시저는 SQL에 프로그래밍 기능을 추가해 프로그래밍 처럼 다룰 수 있음.

 

DELIMITER $$
CREATE PROCEDURE ifProc1()
BEGIN
    if 100 = 100 then
		select '100 is equals 100';
    end if;
END $$

DELIMITER ;

call ifProc1();

 

delimiter $$

create procedure 프로시저명
begin
    프로그래밍
end $$

delimiter ;

기본 구조는 이거고, call 프로시저(); 가 실행

그냥 조건에 따라 sql문을 실행하도록 하는 게 목적인 듯. 반복적으로 하거나

변수 등 활용할 수 있고

 

 

 

if문

if (days/365) >= 5 then
    select '데뷔한 지 ', days, '일이 지났습니다.';
else
    select '데뷔한 지 ', days, ', 5년은 안됐네요.';
end if;
if 조건문 then
	sql문
end if;
if 조건문 then
	sql문
else
	sql문
end if;

if else 문은 없는 듯. case가 if else 역할을 함.

 

 

 

case문

declare score int;
declare pride char(1);

set score = 88;

case
    when score >= 90 then
        set pride = 'A';
    when score >= 80 then
        set pride = 'B';
    when score >= 70 then
        set pride = 'C';
    else
        set pride = 'F';
end case;
select concat('점수 : ', score), concat('학점 : ', pride);
case
    when 조건 then
    	~~
    when 조건 then
    	~~
    else
    	~~
end case;

 

 

 

 

변수선언

declare myNum int;
declare 변수명 타입;

값 할당

set myNum = 200;
set 변수명 = 값;

 

select로 값 가져와서 할당

select debut_date into debutDate from market_db.member where mem_id = 'APN';
select 가져올값 into 변수명 from ~~~~

 

 

 

 

DELIMITER $$

CREATE PROCEDURE ifProc1()
BEGIN
	declare debutDate DATE;
	declare currDate DATE;
    declare days int;
    
    select debut_date into debutDate from market_db.member where mem_id = 'APN';
    
    set currDate = current_date(); --현재 날짜 함수
    set days = datediff(currDate, debutDate);	--일 단위의 날짜 차이
    
    if (days/365) >= 5 then
		select '데뷔한 지 ', days, '일이 지났습니다.';
	else
		select '데뷔한 지 ', days, ', 5년은 안됐네요.';
    end if;
    
END $$

DELIMITER ;

 

 

 

날짜함수

select current_date();	--오늘 일
select current_timestamp();		--오늘 일 + 시간
select datediff('2023-11-06', '2023-12-25');	--날짜 차이(일단위)

 

 

 

while문

while(조건) do
	~~
end while;

while 하면 내용 있어야 함.

아무래도 무한반복 할 수도 있어서 내용 자체가 없으면 오류 내는 듯.

 

delimiter $$
create procedure whileProc()
begin
    declare i int;
    declare hap int;
    set i = 1;
    set hap = 0;
    
    while (i<=100) do
		set hap = hap + i;
        set i = i + 1;
    end while;
    select hap;
end $$
delimiter ;

call whileProc();

 

 

 

while 문 내의 조건문

myWhile:
while (i<=100) do
    if(i%4 = 0) then
        set i = i + 1;
        iterate myWhile;
    end if;
    set hap = hap + i;
    if(hap > 1000) then
        leave myWhile;
    end if;
    set i = i + 1;
end while;

이거는 좀 그런 게 있다.

DB의 프로시저를 완전히 프로그래밍이라고 보지 않아야 할 이유가 하나 있다.

솔직히 leave(break) 까지는 이해한다.

 

근데 iterate myWhile은,

저렇게 위에 myWhile: 이라고 해서 라벨을 달아두고,

iterate, 지정한 라벨로 가서 반복한다고 하는데,

 

이거 그럼 goto문 아닌가?

근데 db의 프로시저에서는 허용해주는 것 같다.

이거는 더 알아봐야 한다.

 

leave는 저 라벨을 떠난다는 거다.

 

 

 

'DB' 카테고리의 다른 글

제약조건  (0) 2023.11.08
동적 SQL  (0) 2023.11.07
join 연습  (0) 2023.11.03
자체 조인  (0) 2023.11.03
상호조인  (0) 2023.11.03