[mySQL] 함수와 프로시저

merci·2022년 12월 18일
0

mySQl 기초

목록 보기
11/11

함수 (Function)

  • 매개값을 받아서 퀴리를 수행후 특정한 값들을 반환한다.
    간단히 구조를 보면
DELIMITER //
create function userFunc(value1 int, value2 int)
 	returns int
begin
	return value1+value2;
end //


select userFunc(100,200);  		-- 결과는 300

DELIMITER 로 시작 //, $$ 와 같은 기호를 사용하여 시작과 끝을 명시함.
create Function + 함수이름( 매개값 타입 ) + returns 리턴 타입,
beginend 사이에 함수 내용을 작성한다.
select 로 함수를 호출하고 매개값을 넣는다.


  • 사원의 연봉을 구하는 함수를 만들어 보자
DELIMITER //
create function get_annual_sal(v_empno int)
	 returns int
begin
	declare v_sal int;
    select (sal + ifnull(comm,0)) * 12 into v_sal
    from emp 
    where empno=v_empno;  		--   입력한 수와 같은 사원번호를 가진 사원의 연봉을 리턴
    						   --  'v_empno' 를 넣으면 컬럼이 아닌 문자 데이터로 받아서 에러!
    return v_sal;
		
end //	


select get_annual_sal(7369);

declare 로 로컬 변수를 선언할 수 있다.
매개값을 받아서 쿼리를 수행하여 변수에 값을 저장한다.
변수에 값을 넣을때 <set 변수명 = 값> OR <select 컬럼 into 변수명> 을 사용.
return 을 마지막에 넣어 변수v_sal 를 리턴

함수의 결과 사원번호 7369의 연봉데이터를 얻음.


  • 사원의 퇴직급여를 구하는 함수
DELIMITER //
create function get_retire_money(v_empno int)
	returns int
begin
	declare v_sal int;
    select (sal + ifnull(comm,0))  --  한달 월급
		* round(timestampdiff(month,hiredate,now())/12,0)   -- 입사후 오늘까지 개월 수 
          			  -- TIMESTAMPDIFF(단위, 날짜1, 날짜2);   두 날짜간의 차이를 구함
	into v_sal
    from emp 
    where empno=v_empno;  
    return v_sal;
		
end //	


select get_retire_money(7369);  

사원번호 7369의 퇴직급여는


  • 이렇게 자주 쓰면서 복잡한 쿼리는 함수로 만들면 사용할때 편하다
select empno "사번"
, ename "성명"
, get_annual_sal(empno) "연봉"
, get_retire_money(empno) "퇴직금"
from emp;    





스토어드 프로시저 (stored procedure)

  • MySQL에서 제공하는 프로그래밍 기능
  • 쿼리의 집합으로서 어떠한 동작을 일괄 처리하는 데 사용 ( 한번에 수행하는것이 포인트 )
  • 자주 사용되는 일반적인 쿼리를 하나하나 실행하는 것이 아니라 모듈화하여 필요할 때마다 호출하기 때문에 MySQL을 한층 더 편리하게 운영할 수 있음
  • 프로시저와 함수의 차이 - 프로시저는 테이블에 영향을 주지만 함수는 조회만 한다.
DELIMITER //				--  프로시저의 간단한 구조
create procedure pr1(a int)  
begin
	select * from emp where deptno = a;  
end
//

call pr1(20); -- CALL 을 이용해 호출;  사원 번호가 20인 사원의 데이터를 조회힌다. 

구조는 함수와 비슷하다
프로시저는 한페이지에 하나씩만 작성한다
호출시에는 CALL 프로시저명(파라미터);


  • 사원의 급여를 조정 하는 프로시저를 생성한다.
DELIMITER //
create procedure adjust_sal(v_flag varchar(20), v_empno int, v_pct int)
begin
	if v_flag = 'INCREASE' then  		-- 매개값이 'INCREASE' 일때
		update emp set sal = sal + (sal*(v_pct/100))
		 where empno = v_empno;
    else								-- 급여가 감소
		update emp set sal = sal - (sal*(v_pct/100))
		 where empno = v_empno;
    end if;   							-- if를 끝낸다
end
//

call adjust_sal('INCREASE', 7369, 10);   -- 사원번호 7369의 급여를 10% 인상

<update 테이블 set 컬럼 = 값> 으로 컬럼을 수정





profile
작은것부터

0개의 댓글