개발자 끄적끄적
function 본문
<function>
CREATE FUNCTION 함수명(인자값들)
RETURNS 반환타입
BEGIN
...
RETURN 반환값;
END;
*함수생성 시 1418오류가 발생하면,
SET GLOBAL log_bin_trust_function_creators = 1; 을 한 번 설정해주고 함수를 생성한다
ex)
CREATE FUNCTION f1(a int)
RETURNS varchar(50)
BEGIN
declare rvalue varchar(20);
return 'kim';
end;
ex)
CREATE FUNCTION f1(a int)
RETURN varchar(50)
BEGIN
declare rvalue varchar(20);
select firstName into rvalue
from employees where employeeNumber = 1002;
return rvalue;
end;
<procedure>
- dbms별 유사한 문법 구조를 갖고 있으나 호환되지 않는다
- 컴파일되어서 해당 dbms내부에 저장된다 따라서, 저장형 프로시져라 불러진다
- 반복해서 컴파일 하려면 먼저 기본 procedure를 drop procedure로 삭제해야한다
(추후 create or replace명령을 지원할 예정이라고 한다)
CREATE PROCEDURE pro_test1()
BEGIN
declare cnt int default 0;
start_rtn : LOOP
INSERT INTO test(s_name) VALUES('HONG');
if(cnt>100) then
leave start_rtn;
end if;
set cnt = cnt + 1;
END LOOP;
END
<procedure 삭제>
- drop procedure [if exists] 프로시져명
<parameters>
- mode : in, out, inout
- in : 외부에서 값을 전달 받을 때
- out : 프로시져 내부에서 처리된 결과를 프로시져 밖에서 사용하고자 할 때
- inout : in+out기능을 모두 갖고 있다
ex)in
CREATE procedure in_test(su1 int, su2 int)
BEGIN
select su1+su2;
END;
ex)out
CREATE procedure out_test1(out str varchar(50))
BEGIN
set str = 'park';
END;
ex)inout
CREATE procedure inout_test1(inout su int, intout su2 int)
BEGIN
set su = su + 100;
set su2 = su2 + 200;
END;
<if-then>
ex)
create procedure if_test1()
begin
declare a int;
declare b int;
set a=10;
set b=20;
if(a>b) THEN
select a;
end if;
if(a<b) THEN
select b;
end if;
end;
<if-then-else>
ex)
create procedure if_test2()
begin
declare a int;
declare b int;
set a=10;
set b=20;
if(a>b) THEN
select a;
else
select b;
end if;
end;
<if-then-elseif-else>
ex)
create procedure if_test3()
begin
declare a int;
declare b int;
declare b int;
set a=10;
set b=20;
set c=30;
if(a>b) then
select a;
elseif a>c then
select b;
else
select c;
end if;
end;
<case>
[첫 번째 유형]
CASE value
WHEN c1 THEN p1;
WHEN c2 THEN p2;
...
ELSE
p3;
END CASE;
- c1, c2는 value에 대응되는 상수값
- p1, p2, p3은 처리 내용
ex)
create procedure case_test1()
begin
declare score int default 0;
declare str varchar(100);
set score=80;
case score
when 80 then set str = '팔십';
when 70 then set str = '칠십';
end case;
select score, str;
end;
[두 번째 유형]
CASE
WHEN c1 THEN p1;
WHEN c2 THEN p2;
ELSE p3
END CASE;
- c1, c2는 범위를 갖는 조건식
ex)
create procedure case_test2()
begin
declare score int default 0;
declare str varchar(100);
set score=80;
case
when score>=90 then set str='A';
when score>=80 then set str='B';
when score>=70 then set str='C';
else set str='F'
end case;
select score, str;
end;
<LOOP>
- 반복 처리와 같은 경우 client tool에 따라 표시 되지 않을 수 있다
[begin_label:] LOOP
statement_list
END LOOF[end_label]
ex)
[label] : LOOP
...
-- terminate the loop
IF condition THEN
LEAVE [label]; - exit
ITERATE [label]; - 반복
END IF;
...
END LOOP;
- LEAVE label : 지정된 label의 반복문을 벗어나게 한다
- ITERATE label : 지정된 label를 반복하게 한다
<while>
begin_label : WHILE 조건 DO
...
END WHILE end_label;
ex)
create procedure whil_test1()
begin
declare cnt int default 0;
declare str varchar(100) default ' ';
begin_label : while cnt<10 do
set cnt = cnt+1;
set str = concat(str, ' ', cnt);
end while;
select str;
end;
<cursor>
<특징>
- Read-only
- Non-scrollable
- Asensitive
<커서 선언하기>
DECLARE cursor_name CURSOR FOR select_statement;
DECLARE CONTINUE HANDLER FOR NOT FOUNT SET finished=1; - 커서에 데이터가 없는 경우
OPEN cursor_name;
FETCH cursor_name INTO variables list;
...
CLOSE cursor_name;
<backup>
*[console 창에서 하는 방법] : mysql설치 폴더는 path에 등록되어 있어야 한다
<데이터베이스 전체 backup>
mysql>mysqldump -u 사용자이름 -p암호 원본데이터베이스명 > 복사할 데이터베이스명.sql
<테이블 backup>
mysql>mysqldump -u 사용자이름 -p암호 원본데이터베이스명 테이블명 > 복사할 데이터 테이블명.sql
- 데이터베이스명과 테이블며은 띄어쓰기 해야한다
- 모든 DB를 백업하려면 mysqldump-all-databases옵션을 사용한다
<restore>
[DB restore]
mysql -u 사용자이름 -p암호 복원할 DB명 < 백업 파일명.sql
- 모든 DB를 restore하려면 mysql-all-databases옵션을 사용한다
'MySQL' 카테고리의 다른 글
테이블 관련 (0) | 2023.03.08 |
---|---|
sub query, index, view, 내장함수 (0) | 2023.03.08 |
join, like, 정규화 (0) | 2023.03.08 |