SQL 문장들을 여러개 모아 하나의 함수처럼 실행하기 위한 것.
Create Procedure 를 사용하여 새로운 Stored Procedure 를 기술한다.
MySQL Workbench 의 Schemas 도구를 통해 Create 화면으로 진입
작성 이후 Apply 를 누른다.
DELIMITER $$
USE 'datamodel' $$
CREATE DEFINER='root'@'localhost' PROCEDURE 'getTest'()
BEGIN
declare ratio int;
set ratio = 15;
if ratio = 10 then
select * from s where status > 20 order by city desc;
else
select sname from s where status < 20;
end if;
END$$
DELIMETER;
Procedure 를 호출 할 때
call getTest();
이러한 형태로 함수 호출을 수행하는데 그렇다면 procedure 의 input 인자는 어떻게 처리하는가?
DELIMITER $$
USE 'datamodel' $$
CREATE DEFINER='root'@'localhost' PROCEDURE 'getTest'(
**in cname varchar(10),
out sumStatus int**
)
BEGIN
**select sum(status)
into sumStatus
from s
where city=cname;**
END$$
DELIMETER;
-------------------------------------------
call getTest('London', @total);
select @total;
DELIMITER $$
USE 'datamodel' $$
CREATE DEFINER='root'@'localhost' PROCEDURE 'getTest'(
in cname varchar(10),
out sumStatus int
)
BEGIN
declare amount int;
set amount = 0;
**case
when cname='London' then
set amount=amount+10;
when cname='London' then
set amount=amount+10;
when cname='London' then
set amount=amount+10;
when cname='London' then
set amount=amount+10;
else
set amount=3;
end case;**
select sum(status)
into sumStatus
from s
where status < amount;
END$$
DELIMETER;
stored Procedure 가 실행되는 도중 발생하는 오류를 감지하고 해당 예외를 처리 할 수 있는 방법이 필요하다.
**declare handler_action handler for condition_value [,condition_value]
... statement**
DELIMITER $$
USE 'datamodel' $$
CREATE DEFINER='root'@'localhost' PROCEDURE 'exception_handle'(
**in tbl varchar(10)**
)
BEGIN
declare continue handler for 1146
select 'NO table of', tbl as 'error message';
select * from tbl;
END$$
DELIMETER;
SQL 문을 prepare 문으로 저장한 뒤 execute 로 실행하는 것을 동적 SQL 이라고 한다.
주의 !
CREATE DEFINER='root'@'localhost' PROCEDURE 'simplePrepare'()
BEGIN
1. declare stmt varchar(40);
2. set @stmp = 'select * from emp';
3. prepare st from @stmp;
4. execute st;
5. deallocate prepare st;
END
CREATE DEFINER='root'@'localhost' PROCEDURE 'simplePrepare'(
in tbl varchar(10),
in val int
)
BEGIN
1. declare stmt varchar(40);
2. declare num int;
3. set @stmp = concat('select * from ', tbl, ' where qty < ?');
4. set @num = val;
5. select @stmt as 'statement';
6. prepare st from @stmp;
7. execute st using @num;
8. deallocate prepare st;
END
concat 을 통해 procedure 의 in 으로 받은 tbl(테이블명)을 전달 한다. tbl 뒤에 이어진 where 문에 동적으로 적용하고자 하는 비교 값을 ? 로 정의
excute 를 @num 을 통해 수행함으로서 where 절 물음표에 num 의 값을 삽입 후 실행
MySQL 에서 제공하는 함수 이외에 사용자 정의 함수를 만들어 사용 할 수 있다.
MySQL Workbench Functions 에서 생성
CREATE FUNCTION `new_function` (
1. money int
)
2. RETURNS INTEGER
BEGIN
3. declare bl varchar(10);
4. if money < 20 then set bl = 'SLiver';
5. elseif money < 40 then set bl = 'Gold';
6. else set bl = 'Platinum';
end if;
7. RETURN bl;
END
CREATE PROCEDURE
1. 'getBugdetLevel'(
2. in deptName varchar(4),
3. out deptLevel varchar(10)
)
BEGIN
4. declare dmoney int;
5.
select budget
into dmoney
from dept
where dname=deptName;
6.
select **bLevel(**dmoney**)**;
into deptLevel;
END
cursor 는 테이블의 각 row 를 하나씩 접근하는 방법을 제공한다.
(테이블 각 레코드 접근하는 것을 cursor)
cursor 는 select 문을 값으로 갖고 있다.
테이블 결과의 각 row 를 가리키는 pointer 역할을 한다.
→ Struct 로 간주.