IT 공부/MySQL

저장 프로그램

toraa 2022. 7. 15. 16:20

저장프로그램 
    - 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