저장프로그램
- sql문은 비절차적 언어
- 다른 응용프로그램처럼 조건 반복등을 자유롭게 구현할 수없다.
- 절차적으로 처리할 수 있도록 기능을 제공하는데 이것이 저장프로그램이다.
- 저장프로시저, 함수, 트리거, 커서
구성
- 정의부분 : 프로그래밍명 입출력 매개변수를 명시하는 부분
- 본문부문 : begin
[변수선언]
[초기화]
SQL 문 --- if, case, repeat 등을 함께 구현
end
변수 : 세션변수(@변수) - 값을 대입하면 데이터타입을 자동지정
지역변수- 반드시 데이터타입을 선언
#=======================================================
select * from 학생;
delimiter $$
create procedure 학생내역() -- <--내가 만드는 이름
begin
select * from 학생; -- 엄청긴내용을 넣기
end$$
delimiter ;
call 학생내역();
#========================================================
select *from 학생 where 학생번호 = '?(달라지는값이라면)';
#방법1
delimiter $$
create procedure test_int(in n char(9))
begin
select *from 학생 where 학생번호 = n;
end&&
delimiter ;
call test_in('201258047');
#==========================================================
#방법2
delimiter $$
create procedure test_int(in n char(9))
begin
set @code =n;
select *from 학생 where 학생번호 = @code;
end&&
delimiter ;
call test_in('201258047');
#===========================================================
call 학생내역();
call test_in();
drop procedure 학생내역;
drop procedure test_in;
call test_in('201258047');
call test_in('201311001');
call test_in('201426007');
select @code 학생코드;
# 학년별종합현황 프로시저를 생성하시오.
delimiter $$
create procedure 학년별종합현황()
begin
select * from 학생;
end$$
delimiter ;
call 학년별종합현황(1);
call 학년별종합현황(2);
call 학년별종합현황(3);
call 학년별종합현황(4);
delimiter $$
create procedure 학생주소검색
(in id char(9), out address varchar(50))
begin
select 주소 into address from 학생 where 학생번호=id;
end$$
delimiter ;
call 학생주소검색('201258047',@address);
select @address 해당주소;
#==========================================================================================
#증감계산 프로시저
delimiter $$
create procedure 증감계산(inout count int, in inc int)
begin
select count+inc into count;
end$$
delimiter ;
set @count =1;
call 증감계산(@count,3);
select @count;
/*
if 조건식 then SQL
elseif 조건식 then SQL
else SQL
*/
delimiter $$
create procedure 강의실배정(in classNo char(4),out classLevel varchar(20))
begin
declare classLimit int;
select 인원제한 into classLimit from 강의 where 강의번호 = classNo;
if classLimit > 80 then
set classLevel = '대강의실';
elseif classLimit <= 80 and classLimit >=40 then
set classLevel ='중강의실';
else
set classLevel = '소강의실';
end if;
end$$
delimiter ;
select * from 강의;
call 강의실배정('C019',@classLevel);
select @classLevel 지정강의실;
delimiter $$
create procedure MT장소 (in grade int, out place varchar(10))
begin
case grade
when 1 then set place = '제주도';
when 2 then set place = '지리산';
when 3 then set place = '강원도';
else set place = '서울';
end case;
end$$
delimiter ;
call MT장소(1,@place);
select @place MT장소;
#case문을 활용해서 강의실배정2 프로시저를 생성해보시오.
#80명보다 크면 대강의실 40-80까지는 중강의실 40명 이하는 소강의실
create procedure MT장소 (in grade int, out place varchar(10))
begin
declare x,y int default 0;
set x=10;
select 100 into y;
end$$
delimiter ;
#학생수조회 프로시저를 작성하시오. -학년을 입력받아서 학생수를 조회해주는 프로시저
/*
반복문
while, repeat , loop
*/
delimiter $$
create procedure 누적합계1(in num int, out sum int)
begin
declare x int;
set x =1;
set sum=0;
while x<=num
do
set sum =sum+x;
set x=x+1;
end while;
end$$
delimiter ;
call 누적합계1(100,@sum);
select @sum '1~100까지의 합';
delimiter $$
create procedure 누적합계2(in num int, out sum int)
begin
declare x int ;
set x = 1;
set sum = 0;
repeat
set sum = sum +x;
set x = x+1;
until x > num
end repeat;
end$$
delimiter ;
call 누적합계2(10,@sum);
select @sum 누적합계;
delimiter $$
create procedure 누적합계3 (in num int, out sum int)
begin
declare x int;
set x =1;
set sum=0;
loop_label: loop
if x>num then
leave loop_label;
end if;
set sun=sum+x;
set x=x+1;
end loop;
end$$
delimiter ;
call 누적합계3(10,@sum);
select @sum 누적합계;
'IT 공부 > MySQL' 카테고리의 다른 글
함수, 트리거 (1) | 2022.07.18 |
---|---|
view (0) | 2022.07.14 |
join 2 (0) | 2022.07.14 |
형변환, group, union, join (0) | 2022.07.13 |
select, 함수 (0) | 2022.07.13 |