5월 5일 어린이날 휴강
녹강으로 대체
mysql에서 제공하는 문법에 의해 데이터베이스 프로그래밍
원하는 데이터를 뽑기 위해 함수 형태로 만듦.
프로그래밍은 프로그램을 설계하고 소스코드를 작성해 디버깅하는 과정임.
왜 만들고, 무엇이 effect로 작용하는지, 인력이 얼마나 사용되는지에 대한 설계단계부터 평가, 디버깅까지 수행한다.
프로그램 설계
맨땅에 헤딩하지 않고 기존에 프로그래밍한 코드를 이용(인터넷, 소스코드) 그후 에러를 잡는 과정
스키마, 릴레이션 간 관계를 파악한다.
db - 서버(db문지기)
사용자가 서버에 요청시 서버는 dbms에 요청해 사용자에게 반응함
응용프로그램과 결합해 사용
데이터베이스 관리 기능과 비주얼 프로그래밍 기능을 갖춘 'GUI 기반 소프트웨어 개발 도구'를 사용해 프로그래밍
대용량 DATA => Oracle(정형데이터)
별도의 라이브러리를 설치 진행 가능.
sql이 이미 절차에 따라 정의됨.
라이브러리를 만들거나 패키지, 함수를 만들때 미리 선언 => 후 사용
한다는 개념에서의 '저장'임.
전역변수, 지역변수
지역변수를 설정해 사용.
별도의 테이블을 만들고 가져오거나 하는 방법 => 복잡해짐.
저장 프로그램은 mysql workbench 에서 바로 작성 컴파일한 후 결과 실행
독립적인 실행 가능.
call 프로시저로 사용
delimiter //
CREATE PROCEDURE dorepeat(p1 INT)
# INT타입의 p1 매개변수 넘김
# 한 문장 끝나면 세미콜론을 붙임. 프로시저에서는 delimiter을 사용해 선언문 적음
vs 함수
return 값이 무조건 있어야
독립적인 실행 불가(select문 등에서 사용해야)
ex. max함수 등
예제를 직접 손으로 쳐볼것.
일일이 insert into 하기 귀찮아 프로시저로 만듦.
프로시저문 작성후 call 하면 insert into 한것과 똑같은 결과.
insert하려고 하는데, 이미 정보가 있으면
동일한 값으로 에러 발생할 것.
이미 값이 있으면 입력하지 않고, 특정 데이터만 업데이트 등 처리 가능.
여러가지 제어문을 다룰 수 있는 문법 제공.
한 문자씩, 한 문장씩
하나의 row 별로 커서가 한줄 한줄 읽어나감.
파일이 끝날때까지!(마지막 줄까지)
예시)
일정금액 이상일때의 조건, 일정 금액 미만일때의 조건이 다름.
delimiter //
CREATE PROCEDURE Interest()
BEGIN
DECLARE myInterest INTEGER DEFAULT 0.0; # 초기값 설정
DECLARE Price INTEGER;
DECLARE endOfRow BOOLEAN DEFAULT FALSE; # endOfRow: 행의 끝을 나타냄
DECLARE InterestCursor CURSOR FOR
SELECT saleprice FROM Orders; # CURSOR: Orders테이블의 saleprice(c언어에서의 포인터같은 개념)
DECLARE CONTINUE handler
FOR NOT FOUND SET endOfRow=TRUE; # 커서가 쭉 파일을 읽다가 더이상 읽을 값이 없을 때(endOfRow=TRUE) 끝냄
OPEN InterestCursor;
cursor_loop: LOOP # LOOP 시작(이름은 설정 가능)
FETCH InterestCursor INTO Price; # FETCH로 하나씩 값을 읽음
IF endOfRow THEN LEAVE cursor_loop; # endOfRow가 true이면 끝남(LEAVE cursor_loop 실행)
END IF;
IF Price >= 30000 THEN
SET myInterest = myInterest + Price * 0.1;
ELSE
SET myInterest = myInterest + Price * 0.05;
END IF;
END LOOP cursor_loop;
CLOSE InterestCursor;
SELECT CONCAT(' 전체 이익 금액 = ', myInterest); # CONCAT를 통해 텍스트 두개를 합침. 내부에서 결과를 보임(out 파라미터를 사용할 수 있음)
END;
//
delimiter ;
# 프로시저의 값을 밖으로 빼는법(전역변수로?)