개발자 끄적끄적

function 본문

MySQL

function

햏치 2023. 3. 8. 00:17

<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