-- SQL PROGRAMING
DELIMITER $$
CREATE PROCEDURE NAME()
BEGIN
SQL CODING
END$$
DELIMITER;
CALL NAME();
-- --------------------
형식
IF <부울 표현식 >THEN
SQL 문장
ELSE
SQL 문장
END IF;
-- EX)
DROP PROCEDURE IF EXISTS ifProc;
DELIMITER $$
CREATE PROCEDURE ifProc()
BEGIN
DECLARE var1 INT; -- 변수 선언
SET var1 = 100; -- 변수에 값 대입
if var1 = 100 then -- 만약 @VAR1이 100 이하라면
select 'it is 100';
ELSE
select 'it is not 100';
end if;
end $$
DELIMITER;
call ifProc();
-- 사용자 정의 변수를 만들때 앞에 @를 붙인다. 하지만 스토어드 프로시져나 함수등에서는 DECLARE문을 사용해서 지역변수를 선언할 수 있다.
-- 이 지역변수는 앞에 @를 붙이지 않고 ,일반 프로그래밍 언어의 변수처럼 사용하면 된다.
DROP PROCEDURE IF EXISTS ifProc2;
use employees;
DELIMITER$$
CREATE PROCEDURE ifProc2()
BEGIN
DECLARE hireDate DATE; -- 입사일
DECLARE curDATE DATE; -- 오늘
DECLARE days INT ; -- 근무한 일수
select hire_date into hireDate -- HIRE_DATE 의 결과를 변수에 대입
from employees
where emp_no=10001;
SET curDATE = current_date(); -- 현재날짜
SET days = datediff(curDATE, hireDATE); -- 날짜의 차이 , 일 단위
IF (days/365) >= 5 then
select concat('입사한지 ', days ,'일이나 지났습니다. 축하합니다.');
else
select '입사한지 ' + days + '일 밖에 안되었네요 열심히 일하세요 ';
end if;
end$$
delimiter;
call ifProc2();
-- -----------------------------------------------------
-- IF ELSE
DROP PROCEDURE IF EXISTS ifProc3;
DELIMITER $$
CREATE PROCEDURE ifProc3()
BEGIN
DECLARE point INT;
DECLARE credit CHAR(1);
SET point = 77;
IF point >= 90 THEN
SET credit = 'a';
ELSEIF point >= 80 then
set credit ='b';
ELSEIF point >= 70 then
set credit ='c';
ELSEIF point >= 60 then
set credit = 'd';
else
set credit = 'f';
end if;
select concat('jumsoo==>',point), concat('hakjum',credit);
end $$
DELIMITER;
CALL ifProc3();
-- CASE
DROP PROCEDURE IF EXISTS caseProc;
DELIMITER $$
CREATE PROCEDURE caseProc()
BEGIN
DECLARE point INT;
DECLARE credit CHAR(1);
SET point = 77;
CASE
WHEN point >= 90 then
set credit = 'a';
WHEN point >= 80 then
set credit = 'b';
WHEN point >= 70 then
set credit = 'c';
WHEN point >= 60 then
set credit = 'd';
else
set credit = 'f';
end case;
select concat('jumsoo==>', point), concat('hakjum==>', credit);
end $$
DELIMITER;
call caseProc();
--
-- WHILE / ITERATE / LEAVE
--
--
-- 형식 :
--
-- WHILE 식 DO
--
-- SQL 명령문
--
-- END WHILE;
-- 1에서 100까지의 값을 모두 더하는 간단한 기능을 구연해 보자
--
DROP PROCEDURE IF EXISTS whileProc;
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();
-- iterate , leave
DROP PROCEDURE IF EXISTS whileProc2;
DELIMITER $$
CREATE PROCEDURE whileProc2()
BEGIN
DECLARE i INT ;
DECLARE hap INT;
SET i = 1;
SET hap = 0;
myWhile:WHILE (i<=100) DO -- WHILE 문에 LABEL을 지정
IF (i%7 = 0) then
SET i = i+1 ;
iterate myWhile; -- 지정한 LABEL 문으로 가서 계속 실행
end if;
SET hap = hap +i;
if(hap > 1000) then
LEAVE myWhile ; -- 지정한 LABEL 문을 떠남 , 즉 WHILE 종료
END if;
set i = i+1;
end while;
SELECT hap;
END $$
DELIMITER;
CALL whileProc2();
-- 동적 쿼리
-- REPARE는 쿼리를 준비하는 명령어 이고 , EXECUTE는 앞에서 준비한 쿼리를 실행하는 명령문이다.
-- EXECUTE 에서 USING 을 이용해서 값을 전달할수도 있다.
DROP TABLE IF EXISTS EXAM;
CREATE TABLE EXAM(ID INT AUTO_INCREMENT PRIMARY KEY, mDate DATETIME);
SET @curDATE = CURRENT_TIMESTAMP();
PREPARE myQuery from 'INSERT INTO EXAM VALUES(NULL,?)';
EXECUTE myQuery USING @curDATE;
DEALLOCATE PREPARE myQuery;
select * from EXAM;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | -- SQL PROGRAMING DELIMITER $$ CREATE PROCEDURE NAME() BEGIN SQL CODING END$$ DELIMITER; CALL NAME(); -- -------------------- 형식 IF <부울 표현식 >THEN SQL 문장 ELSE SQL 문장 END IF; -- EX) DROP PROCEDURE IF EXISTS ifProc; DELIMITER $$ CREATE PROCEDURE ifProc() BEGIN DECLARE var1 INT; -- 변수 선언 SET var1 = 100; -- 변수에 값 대입 if var1 = 100 then -- 만약 @VAR1이 100 이하라면 select 'it is 100'; ELSE select 'it is not 100'; end if; end $$ DELIMITER; call ifProc(); -- 사용자 정의 변수를 만들때 앞에 @를 붙인다. 하지만 스토어드 프로시져나 함수등에서는 DECLARE문을 사용해서 지역변수를 선언할 수 있다. -- 이 지역변수는 앞에 @를 붙이지 않고 ,일반 프로그래밍 언어의 변수처럼 사용하면 된다. DROP PROCEDURE IF EXISTS ifProc2; use employees; DELIMITER$$ CREATE PROCEDURE ifProc2() BEGIN DECLARE hireDate DATE; -- 입사일 DECLARE curDATE DATE; -- 오늘 DECLARE days INT ; -- 근무한 일수 select hire_date into hireDate -- HIRE_DATE 의 결과를 변수에 대입 from employees where emp_no=10001; SET curDATE = current_date(); -- 현재날짜 SET days = datediff(curDATE, hireDATE); -- 날짜의 차이 , 일 단위 IF (days/365) >= 5 then select concat('입사한지 ', days ,'일이나 지났습니다. 축하합니다.'); else select '입사한지 ' + days + '일 밖에 안되었네요 열심히 일하세요 '; end if; end$$ delimiter; call ifProc2(); -- ----------------------------------------------------- -- IF ELSE DROP PROCEDURE IF EXISTS ifProc3; DELIMITER $$ CREATE PROCEDURE ifProc3() BEGIN DECLARE point INT; DECLARE credit CHAR(1); SET point = 77; IF point >= 90 THEN SET credit = 'a'; ELSEIF point >= 80 then set credit ='b'; ELSEIF point >= 70 then set credit ='c'; ELSEIF point >= 60 then set credit = 'd'; else set credit = 'f'; end if; select concat('jumsoo==>',point), concat('hakjum',credit); end $$ DELIMITER; CALL ifProc3(); -- CASE DROP PROCEDURE IF EXISTS caseProc; DELIMITER $$ CREATE PROCEDURE caseProc() BEGIN DECLARE point INT; DECLARE credit CHAR(1); SET point = 77; CASE WHEN point >= 90 then set credit = 'a'; WHEN point >= 80 then set credit = 'b'; WHEN point >= 70 then set credit = 'c'; WHEN point >= 60 then set credit = 'd'; else set credit = 'f'; end case; select concat('jumsoo==>', point), concat('hakjum==>', credit); end $$ DELIMITER; call caseProc(); -- -- WHILE / ITERATE / LEAVE -- -- -- 형식 : -- -- WHILE 식 DO -- -- SQL 명령문 -- -- END WHILE; -- -- 1에서 100까지의 값을 모두 더하는 간단한 기능을 구연해 보자 -- DROP PROCEDURE IF EXISTS whileProc; 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(); -- iterate , leave DROP PROCEDURE IF EXISTS whileProc2; DELIMITER $$ CREATE PROCEDURE whileProc2() BEGIN DECLARE i INT ; DECLARE hap INT; SET i = 1; SET hap = 0; myWhile:WHILE (i<=100) DO -- WHILE 문에 LABEL을 지정 IF (i%7 = 0) then SET i = i+1 ; iterate myWhile; -- 지정한 LABEL 문으로 가서 계속 실행 end if; SET hap = hap +i; if(hap > 1000) then LEAVE myWhile ; -- 지정한 LABEL 문을 떠남 , 즉 WHILE 종료 END if; set i = i+1; end while; SELECT hap; END $$ DELIMITER; CALL whileProc2(); -- 동적 쿼리 -- REPARE는 쿼리를 준비하는 명령어 이고 , EXECUTE는 앞에서 준비한 쿼리를 실행하는 명령문이다. -- EXECUTE 에서 USING 을 이용해서 값을 전달할수도 있다. DROP TABLE IF EXISTS EXAM; CREATE TABLE EXAM(ID INT AUTO_INCREMENT PRIMARY KEY, mDate DATETIME); SET @curDATE = CURRENT_TIMESTAMP(); PREPARE myQuery from 'INSERT INTO EXAM VALUES(NULL,?)'; EXECUTE myQuery USING @curDATE; DEALLOCATE PREPARE myQuery; select * from EXAM; | cs |
'데이터 베이스 > MySQL' 카테고리의 다른 글
MYSQL 스토어드 함수 예제&문제 14 (4) | 2016.12.16 |
---|---|
MYSQL procedure&프로시저 예제&문제 13 (2) | 2016.12.16 |
MYSQL join&inner join & outer join 예제&문제 11 (1) | 2016.12.14 |
MYSQL join 예제&문제 10 (4) | 2016.12.14 |
MYSQL 부속질의어 예제&문제 9 (3) | 2016.12.13 |
댓글