스토어드 프로시저는 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는 저 라벨을 떠난다는 거다.