8주차
DELIMITER를 사용하고 SQL에서 프로시저를 만드는 방법을 배웠다. 변수를 선언하고 WHILE문을 사용했다.
JAVA처럼 IF 문도 사용하고 함수를 호출하는게 신기했다.
동적메모리를 할당하고 해제시켜주는 DEALLOCATE를 배웠다.
현업에서는 프로시저를 되게 많이 쓴다고하셨다. 프로젝트할때도 꼭 필요로하는 내용이니까 숙지해야한다.
오늘은 진도는 길게 안나가고 프로그래머스에 있는 SQL 모든 문제푸는 시간을 가졌다.
배운점
WHILE / ITERTE / LEAVE
DELIMITER : C나 JAVA의 세미콜론(;), 문법의 끝을 나타내는 역할 ,,, delimiter 명령어 뒤에 구문 문자로 사용하고자 하는 문자를 넣어주면 된다.
프로시저 안의 세미콜론(;)으로 인해 여러 명령문으로 나눠지는 것을 막고 프로시저 자체를 하나의 명령문으로 묶어주기 위해서 Delimiter 를 사용
형식: WHILE <부울 식> DO SQL 명령문들.... END WHILE;
1부터 100까지 값을 모두 더하는 기능
DROP PROCEDURE IF exists whilePrc; -- 프로시저 있으면 drop
DELIMITER $$
CREATE procedure whilePrc()
BEGIN
declare i INT; -- 선언
declare hap INT; -- 선언
SET i = 1; -- 초기화
set hap = 0;
while(i <= 100) do -- 7의 배수만 제외하고 누적의 합
set hap = hap + i;
set i = i+1;
end while;
select hap; -- select 는 print 라는 뜻
END; $$
call whilePrc();
7의 배수만 제외하고 누적의 합구하기
DROP PROCEDURE IF exists whilePrc1;
DELIMITER $$
CREATE procedure whilePrc1()
BEGIN
declare i INT; -- 선언
declare hap INT; -- 선언
SET i = 1; -- 초기화
set hap = 0;
myWhile: while(i <= 100) do -- 7의 배수만 제외하고 누적의 합
if(i%7 = 0) then
set i = i+1;
iterate myWhile;
end if;
set hap = hap +i; -- select 는 print 라는 뜻
if(hap > 1000) then
leave myWhile;
end if;
set i = i+1;
end while;
select hap;
END; $$
call whilePrc1();
delimiter ; 하고 닫아줘야함 . 그래야 서로 다른 procedure라고 인식함
원래 한파일당 한 프로시저 적는게 맞음
elimiter 띄우고 ; 쓸 것
1부터 1000까지의 숫자 중에서 3의배수 또는 8의 배수만 더하는 procedure whileProc2 작성하세요 3+6+8
DROP PROCEDURE IF exists whilePrc3;
delimiter $$
create procedure whileProc3()
begin
declare i int;
declare hap int;
set i = 1;
set hap = 0;
mylabel2: while(i<=1000) do
if(i % 3 = 0 or i % 8 = 0 ) then
set hap = hap + i;
set i = i + 1;
iterate mylabel2;
end if;
/* if(i % 8 = 0) then
set hap = hap + i;
set i = i + 1;
end if; */
set i = i+1;
end while;
select hap;
end $$
delimiter ;
call whileProc3();
오류 처리 DECLARE action HANDLER FOR 오류조건 처리할 문장;
action : 오류 발생 시 행동을 정의. CONTINUE, EXIT 둘 중 하나 선택. CONTINUE 선택시 제일 뒤의 ' 처리할 문장'이 처리된다.
오류조건 : 어떤 오류를 처리할 것인지 지정. SQLEXCEPTION, SQLWARNING, NOT FOUND
처리할 문장 : 한문장, 처리할 문장이 여러개일 경우 BEGIN 문장들 END
에러 프로시저 만들어서 에러에대해 대비해야한다! , 모든 프로시저에 에대해서 인서트 딜리트 업데이트 등..
SQLSTATE
1146, 42S02 : 테이블이 없을 경우
DROP procedure IF exists errorPrc;
delimiter $$
create procedure errorPrc()
begin
declare continue handler for 1146 select '테이블이 존재하지않아요' as 'message';
select * from noTable;
end $$
delimiter ;
call errorPrc();
insert into로 중복값 넣기 오류
테이블에 있는 BBK를 또 넣는다.
error 메시지가 출력된다.
DROP PROCEDURE IF exists errorPrc2;
delimiter $$
CREATE procedure errorPrc2()
BEGIN
show errors;
select '오류가 발생하여 작업을 취소시켰습니다.' as 'message';
rollback;
INSERT INTO usertbl values ('BBK','신세계',1990,'서울',null,null,178,current_date()); -- 중복값
end $$
delimiter ;
call errorPrc2();
deallocate
해제 시키기, 동적 쿼리를 필요할때만 쓰고 바로바로 해제 시켜줌
prepare myQuery FROM 'SELECT * FROM usertbl where userID = "EJW"'; -- 충돌막기위해 싱글, 더블 쿼테이션
execute myQuery;
deallocate prepare myQuery; -- 해제 시키기, 동적 쿼리를 필요할때만 쓰고 바로바로 해제 시켜줌
연습문제
datetime 타입 사용, current_timestamp() 사용
-- myTable 생성(id auto_increment, pk, mdate datetime);
drop table if exists myTable;
create table myTable (id int primary key auto_increment, mdate datetime);-- date로해야 시분초가 들어간다.
-- curDate 변수에 날짜함수를 이용하여 현재 날짜와 시간을 시스템으로 부터 받아서 할당
set @curDate = current_timestamp();
-- myQuery 동적 쿼리 작성, myTable에 값을 파라메터 값(?)으로 입력한다.
prepare myQuery From 'insert into myTable values (null,?)';
-- myQuery 실행
execute myQuery using @curDate;
-- myQuery 해제
deallocate prepare myQuery;
-- myTable 전체 정보 조회
select * from myTable;
회고
용어들에 익숙해지고, 자기가 공부하는 트랙에 집중하라고 하셨다. 스타트가 다를뿐 서로의 실력차는 희미해진다. 꾸준하게, 커리어패스를 잘 가지고 가느냐가 중요하다고 하셨다. 다른 사람들이 내가 안하는걸 하고있으면 저것도 해야되나하고 비교하게 된다. 내가 지금 계획중인 OS 다음 네트워크 다음 도커 과정을 꾸준히 밀고나가겠다.
프로그래머스 SQL 부분을 풀고 있다. SQL을 이론으로만 배우고 사용을 해보고 싶었는데 좋은 기횐가 싶다. 근데 어려워서 시간이 좀 걸린다. 공부됨을 느낀다.
'신세게 - Java 공부' 카테고리의 다른 글
9주차 배운점 느낀점 - 이상현상, 함수 종속성, 정규화 (3) | 2024.10.07 |
---|---|
8주차 배운점 느낀점 - 저장 프로그램, PROCEDURE, CURSOR, FUNCTION, 데이터 모델링 (10) | 2024.10.07 |
8주차 배운점 느낀점 - MysQL 데이터 형식, 문자열 함수, 파일 입출력 (10) | 2024.10.07 |
7주차 배운점 느낀점 - sql 문제, 내장 함수, view, index, 물리적 저장 (8) | 2024.10.05 |
7주차 배운점 느낀점 - join, Outer join, MINUS, INTERSECT, EXISTS (1) | 2024.10.05 |