반응형
 
 
 
 

 

👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇

 

GitHub - gayulz/StudyHistory: 나의 공부 기록 commit

나의 공부 기록 commit . Contribute to gayulz/StudyHistory development by creating an account on GitHub.

github.com

 

 

 


 

프로젝트 과정 4 - 기본 구조 Query 만들기

 

 

2023/09/12👋 ORACLE Final Task - 프로젝트 과제를 받다

👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇 GitHub - gayulz/StudyHistory: 나의 공부 기록 commit 나의 공부 기록 commit . Contribute to gayulz/StudyHistory development by creating an account on GitHub.

yurizzy.tistory.com

 

이전 글 이후의 과제 스토리 입니다 .

학원에 남아 전체적인 구조 Query와 Import 문을 짜기 시작했습니다.

그리고 집에 와서도 회의 및 해당 내용 진행도 마무리하는 걸로 했습니다.

 

-------------------------------------------------------------------------------------------------------------
-- 					CREATE TABLE 쿼리 1. 회원 테이블 
-------------------------------------------------------------------------------------------------------------

CREATE TABLE CUSTOMER (     
	  cos_num NUMBER
	, cos_id varchar2(15)  NOT NULL
	, cos_name varchar2(10) NOT NULL
	, cos_pass varchar2(15) NOT NULL
	, cos_phone varchar2(13) 
	, cos_point NUMBER DEFAULT 0    
	
	, PRIMARY KEY (cos_num)  															
	, UNIQUE (cos_id) 				 													
);

/* 
	회원 포인트, 기본값은 0으로 함
	회원번호를 기본키로 설정 
	회원의 아이디가 중복되지 않도록 unique 제약조건 설정

*/
-------------------------------------------------------------------------------------------------------------
-- 					CREATE TABLE 쿼리 2. 영화 정보 테이블 
-------------------------------------------------------------------------------------------------------------

CREATE TABLE CUSTOMER (     
	  cos_num NUMBER
	, cos_id varchar2(15)  NOT NULL
	, cos_name varchar2(10) NOT NULL
	, cos_pass varchar2(15) NOT NULL
	, cos_phone varchar2(13) 
	, cos_point NUMBER DEFAULT 0  
	
	, PRIMARY KEY (cos_num)  			
	, UNIQUE (cos_id) 					
);

/*
 	회원 포인트, 기본값은 0으로 함
	회원번호를 기본키로 설정 
	회원의 아이디가 중복되지 않도록 unique 제약조건 설정
*/
-------------------------------------------------------------------------------------------------------------
-- 					CREATE TABLE 쿼리 3. 상영 정보 테이블 
-------------------------------------------------------------------------------------------------------------

CREATE TABLE SHOW_DAY (  				
	  sh_num NUMBER  					
	, sh_time DATE   					
	, sh_movien NUMBER NOT NULL			
	, mo_num NUMBER  					
	, CONSTRAINT show_pk 

	 PRIMARY KEY (sh_num) 				
	, FOREIGN KEY (mo_num) REFERENCES MOVIE(mo_num) 	
	, UNIQUE (sh_movien) 								
);

/*
 	상영정보, 일정번호, 상영시간, 상영관 번호,영화번호
 	일정 번호를 기본 키로 지정 하여 영화 번호를 영화 테이블의 영화 번로참조하는 외래키로 지정한다
 	상영관 번호는 중복되어선 안된다 
 */
------------------------------------------------------------------------------------------------------------- 
-- 					CREATE TABLE 쿼리 4. 영화관 정보 테이블  
-------------------------------------------------------------------------------------------------------------

CREATE TABLE MOVIE_ROUNGE (  								
	  ro_num	NUMBER   									
	, ro_seet	NUMBER CHECK ( ro_seet <= 200) 				
    , re_seet  	NUMBER NOT NULL 					

	, CONSTRAINT rounge_fk
	  FOREIGN KEY (ro_num) REFERENCES SHOW_DAY(sh_movien)	
);															

/*
	영화관
 	상영관 번호 , 총좌석 : 좌석은 200개가 넘지 않도록 제한 , 잔여좌석 
 	부모테이블인 SHOW_DAY의 sh_movien과 자식 테이블인 MOVIE_ROUNGE 외래키 지정
*/
-------------------------------------------------------------------------------------------------------------
 --					CREATE TABLE 쿼리 5. 예매 정보 테이블 
-------------------------------------------------------------------------------------------------------------

CREATE TABLE TICKETTING (  								 
	  ti_num	number	 								
	, sh_num	number									
	, cos_num	number									
	, ti_nop	NUMBER	NOT NULL						
	, CONSTRAINT ticket_pk
	    PRIMARY KEY (ti_num)		  					
	  , FOREIGN KEY (sh_num) REFERENCES SHOW_DAY (sh_num) ON DELETE SET NULL  								 
	  , FOREIGN KEY (cos_num) REFERENCES CUSTOMER (cos_num)	ON DELETE SET NULL  								
);														 
														 

/*
		예매 정보
		예매 번호 , 일정번호 , 회원 번호, 인원 수 
		예매 번호를 기본 키로 지정
		일정번호 외래외래키로 지정하며 부모 테이블인 SHOW_DAY	테이블에 정보 삭제 시 NULL로 보존
		회원번호 외래키 지정 부모 테이블인 CUSTOMER에 정보 삭제되더라도 NULL값으로 처리되며 정보유지 옵션지정
 */
-------------------------------------------------------------------------------------------------------------
-- 					CREATE TABLE 쿼리 6. 결제 정보 테이블 
-------------------------------------------------------------------------------------------------------------

CREATE TABLE PAY (  																					
       ti_num	number																			
     , py_type	varchar2(20)	CHECK															
        (py_type IN('카드', '삼성페이', '카카오페이', '애플페이', '네이버페이', '상품권'))  	
     , py_tot	number	DEFAULT 15000															
    	CONSTRAINT pay_fk FOREIGN KEY (ti_num) 	
			REFERENCES TICKETTING (ti_num) 														
			ON DELETE CASCADE																	
);																								

/*
		결제 정보
		예약 번호, 결제 방법, 결제 방법 입력 값 체크제약으로 제한 , 1인당 기본 티켓 금액, 15000원으로고정 
 		부모 테이블인 TICKETTING 테이블에 예매번호
 		삭제 시 자식 테이블인 PAY 테이블에도 정보가 삭제 될 수 있도록 옵션 추가
 */
 
-------------------------------------------------------------------------------------------------------------
-- 					CREATE TABLE 쿼리 7. 리뷰 정보 테이블  
-------------------------------------------------------------------------------------------------------------

CREATE TABLE REVIEW ( 				
	  mo_num	number				
	, re_text	varchar2(100)			
	, CONSTRAINT re_fk
	FOREIGN KEY (mo_num) REFERENCES MOVIE (mo_num) ON DELETE CASCADE 				
);						


/*
		리뷰 정보
		 부모 테이블인 MOVIE테이블에 영화 넘버가 삭제 시 = 영화 삭제
		 자녀 테이블인 Review테이블에 자료도 삭제될 수 있도록 옵션지정
		
*/
-------------------------------------------------------------------------------------------------------------
-- 					CREATE SEQUENCE 쿼리 1. 회원 번호 
-------------------------------------------------------------------------------------------------------------
CREATE SEQUENCE CUSTOMER_no INCREMENT BY 1;

-------------------------------------------------------------------------------------------------------------
-- 					CREATE SEQUENCE 쿼리 2. 예매 번호 
-------------------------------------------------------------------------------------------------------------

CREATE SEQUENCE TI_no INCREMENT BY 1;

-------------------------------------------------------------------------------------------------------------
-- 					CREATE SEQUENCE 쿼리 3. 일정 정보 번호 
-------------------------------------------------------------------------------------------------------------

CREATE SEQUENCE show_day_seq INCREMENT BY 1;
-------------------------------------------------------------------------------------------------------------
-- 					INSERT 쿼리 1. 회원 정보 : 16개 
-------------------------------------------------------------------------------------------------------------

INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'abccddfg','김나라','**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'a42141','밤나라', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'abcsdfafg','강나라', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'aasd124ddfg','집가라', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'233fscbg','최춘식', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'ab5dssg','이도용', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'abccssdkkdfg','홍도도', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'aSdfsddfg','추마을', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'Gsfdddfg','서마은', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'abcSdf','솔방울', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'aSdfsfg','하도녀', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'aSDsfsdfg','박신령', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'aGssssgdfg','주도용', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'gsdfsdf','최범죄', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'aSDsfafg','옥도시', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'abSDdsafsg','반나라', '**123456**', '010-0101-0202', DEFAULT );
INSERT INTO CUSTOMER VALUES (customer_no.NEXTval ,'abcgggg','민나라', '**123456**', '010-0101-0202', DEFAULT );

-------------------------------------------------------------------------------------------------------------
--					CREATE SEQUENCE 쿼리 2. 영화 정보 등록 : 6개 
-------------------------------------------------------------------------------------------------------------

INSERT INTO MOVIE VALUES (1,'통증', '권상우', '드라마', '곽경택' );
INSERT INTO MOVIE VALUES (2,'베니스 유령 살인사건', '케네스', '스릴러', '곽경택' );
INSERT INTO MOVIE VALUES (3,'천박사 퇴마 연구소', '강동원', '액션', '김성식' );
INSERT INTO MOVIE VALUES (4,'너의 이름은', '카미키', '애니', '신카이' );
INSERT INTO MOVIE VALUES (5,'쿵푸허슬', '주성치', '코미디', '주성치' );
INSERT INTO MOVIE VALUES (6,'박쥐', '송강호', '드라마', '박찬옥' );



-------------------------------------------------------------------------------------------------------------
 --					CREATE SEQUENCE 쿼리 3. 리뷰 정보 등록 60개  
-------------------------------------------------------------------------------------------------------------

INSERT INTO REVIEW VALUES (1,'정말 재밌네요');
INSERT INTO REVIEW VALUES (1,'정말 재미없어요');
INSERT INTO REVIEW VALUES (1,'돈 아깝네요');
INSERT INTO REVIEW VALUES (2,'세 시간이 지나는줄 모르고 집중했습니다.');
INSERT INTO REVIEW VALUES (2,'등장인물이 많아서 좀 버거웠어요');
INSERT INTO REVIEW VALUES (2,'지루한건 나뿐인가... 극장이라 다 봄');
INSERT INTO REVIEW VALUES (2,'영화는 재밌다만.. 감독은 크게 발전 없는 느낌');
INSERT INTO REVIEW VALUES (3,'처음부터 몰입해서 보느라 3시간이 생각 안났어요.');
INSERT INTO REVIEW VALUES (3,'보는 내내 착잡한 기분이 든 영화');
INSERT INTO REVIEW VALUES (3,'얼굴 구분 어려움 있는분들은 좀 힘들어요');
INSERT INTO REVIEW VALUES (3,'주인공 연기가 인상 깊음');
INSERT INTO review VALUES (3,'단 한 장면도 CG 사용되지 않았다!!');
INSERT INTO review VALUES (3,'너무나도 재밋어요 오랜만에 신나게 웃었어요');
INSERT INTO review VALUES (1,'무엇이 국익을 위한 일인가');
INSERT INTO review VALUES (2,'폭탄을 소재로 폭탄을 터뜨리는듯 플롯을 짠 야심작');
INSERT INTO review VALUES (4,'아는만큼 보이는 영화 연출이 좋았다.');
INSERT INTO review VALUES (2,'너무 재밌어서 또 보고싶음');
INSERT INTO review VALUES (1,'3시간 동안 밀도가 뺵빽한데도 지루할 틈이 없었다.');
INSERT INTO review VALUES (3,'극장 팝콘이 맛나요');
INSERT INTO review VALUES (5,'다큐영화 같았네요 지루함.');
INSERT INTO review VALUES (6,'음악과 연출이 좋았어요.');
INSERT INTO review VALUES (6,'드디어 인간의 감정을 다룰줄 알게 된 누룽지');
INSERT INTO review VALUES (6,'마치 3시간이 30분 같았다.');
INSERT INTO review VALUES (1,'한 인간의 인생사로서 이 영화는 너무나 아름답고 경이롭다.');
INSERT INTO review VALUES (6,'비범한 사람이 평범해지는 과정');
INSERT INTO review VALUES (6,'지난 주말 극장가서 잘 보고왔다');
INSERT INTO review VALUES (4,'삼성이 이 영화를 좋아하지 않습니다.');
INSERT INTO review VALUES (3,'배우들 연기만으로 볼 가치가 있다.');
INSERT INTO review VALUES (1,'걍 봐바 걍 봐');
INSERT INTO review VALUES (5,'핸드폰에 우리의 모든 삶이 다 있다.');
INSERT INTO review VALUES (5,'코믹하면서도 생각 해볼만한 내용이 많은 영화!');
INSERT INTO review VALUES (3,'가볍게 즐길 수만은 없었던 블랙코미디');
INSERT INTO review VALUES (4,'꿀잼입니당 완전 꿀꿀잼이에용');
INSERT INTO review VALUES (6,'유쾌하면서 다른의미로 많은 생각을 하게되네요');
INSERT INTO review VALUES (4,'보는 내내 불안불안함');
INSERT INTO review VALUES (4,'어후 스트레스 받아....');
INSERT INTO review VALUES (5,'생각없이 봤는데 재밌네요');
INSERT INTO review VALUES (1,'진짜 죽는줄 ㅋㅋㅋ 나였으면...');
INSERT INTO review VALUES (2,'정말 많이 웃고왔어요... 그래도 한번쯤 생각하게 되는 영화였어요');
INSERT INTO review VALUES (3,'조아용ㅎㅎㅎ 재밌었어요');
INSERT INTO review VALUES (5,'재미로만 보면 이 영화가 천만 영화가 되어야 마땅하다.');
INSERT INTO review VALUES (3,'다들 연기 잘하고 재미있게 봐써용');
INSERT INTO review VALUES (4,'남자친구와 처음 본 영화인데 재밌었어요');
INSERT INTO review VALUES (4,'엄마랑 편하게 재밌게 봤어요');
INSERT INTO review VALUES (2,'연극으로 올려도 재밌을것같다.');
INSERT INTO review VALUES (5,'누구나 감추고싶은 비밀이 있다');
INSERT INTO review VALUES (3,'김 감독님 멋있어요');
INSERT INTO review VALUES (4,'좁은공간에서 어떻게 이런 연출을 하는지 대단.. 꿀잼');
INSERT INTO review VALUES (5,'배우들 연기가 좋아서 몰입이 잘됐어요.');
INSERT INTO review VALUES (1,'기아타이거즈 화이팅');
INSERT INTO review VALUES (2,'케이티위즈 화이팅');
INSERT INTO review VALUES (3,'고 배우 너무너무 재밌네요');
INSERT INTO review VALUES (6,'소 배우의 연기력 너무너무 좋았어요');
INSERT INTO review VALUES (1,'독특한 소재여서 흥미로움');
INSERT INTO review VALUES (3,'장면 하나하나 다 터졌네요');
INSERT INTO review VALUES (5,'다 똑같은 세상을 살고있겠찌?');
INSERT INTO review VALUES (3,' 배우님 너무 굿이에요 긋긋긋');
INSERT INTO review VALUES (2,'율 배우의 감정연기의 끝은 어디까지인가...');
INSERT INTO review VALUES (4,'긴장감있고 잼나게 보았네요');
INSERT INTO review VALUES (6,'인간이 얼마나 쓰레기인지 잘 보여준 영화');



-------------------------------------------------------------------------------------------------------------
 --					CREATE SEQUENCE 쿼리 4. 상영 정보  : 5개  
-------------------------------------------------------------------------------------------------------------

INSERT INTO SHOW_DAY(sh_num, sh_time, sh_movien, mo_num) VALUES(show_day_seq.nextval, to_date('20230913', 'YYYYMMDDHH24MISS'), 1, 1);
INSERT INTO SHOW_DAY(sh_num, sh_time, sh_movien, mo_num) VALUES(show_day_seq.nextval, to_date('202309131530', 'YYYYMMDDHH24MISS'), 2 ,2);
INSERT INTO SHOW_DAY(sh_num, sh_time, sh_movien, mo_num) VALUES(show_day_seq.nextval, to_date('202309131700', 'YYYYMMDDHH24MISS'), 3, 3);
INSERT INTO SHOW_DAY(sh_num, sh_time, sh_movien, mo_num) VALUES(show_day_seq.nextval, to_date('202309131200', 'YYYYMMDDHH24MISS'), 4, 4);
INSERT INTO SHOW_DAY(sh_num, sh_time, sh_movien, mo_num) VALUES(show_day_seq.nextval, to_date('202309131200', 'YYYYMMDDHH24MISS'), 5, 5);


-------------------------------------------------------------------------------------------------------------
 --					CREATE SEQUENCE 쿼리 5. 상영관 정보 : 5개  
-------------------------------------------------------------------------------------------------------------

INSERT INTO MOVIE_ROUNGE(ro_num, ro_seet, re_seet) VALUES(1, 200, 200);
INSERT INTO MOVIE_ROUNGE(ro_num, ro_seet, re_seet) VALUES(2, 150, 150);
INSERT INTO MOVIE_ROUNGE(ro_num, ro_seet, re_seet) VALUES(3, 180, 180);
INSERT INTO MOVIE_ROUNGE(ro_num, ro_seet, re_seet) VALUES(4, 150, 150);
INSERT INTO MOVIE_ROUNGE(ro_num, ro_seet, re_seet) VALUES(5, 200, 200);

-------------------------------------------------------------------------------------------------------------
-- 					CREATE SEQUENCE 쿼리 6. 예매 정보 : 19개 
-------------------------------------------------------------------------------------------------------------

insert into ticketting values (ti_no.nextval,1,1,4);
insert into ticketting values (ti_no.nextval,2,2,5);
insert into ticketting values (ti_no.nextval,4,3,1);
insert into ticketting values (ti_no.nextval,3,4,2);
insert into ticketting values (ti_no.nextval,5,5,6);
insert into ticketting values (ti_no.nextval,2,10,4);
insert into ticketting values (ti_no.nextval,5,11,4);
insert into ticketting values (ti_no.nextval,4,14,2);
insert into ticketting values (ti_no.nextval,5,15,3);
insert into ticketting values (ti_no.nextval,1,1,4);
insert into ticketting values (ti_no.nextval,2,2,5);
insert into ticketting values (ti_no.nextval,4,3,1);
insert into ticketting values (ti_no.nextval,3,4,2);
insert into ticketting values (ti_no.nextval,3,2,1);
insert into ticketting values (ti_no.nextval,5,11,4);
insert into ticketting values (ti_no.nextval,3,2,1);
insert into ticketting values (ti_no.nextval,5,11,4);
insert into ticketting values (ti_no.nextval,2,2,5);
insert into ticketting values (ti_no.nextval,2,2,5);


-------------------------------------------------------------------------------------------------------------
-- 					CREATE SEQUENCE 쿼리 7. 결제 정보 입력 19개 
-------------------------------------------------------------------------------------------------------------

insert into pay values (1 , '카드', DEFAULT);
insert into pay values (2,'카드',DEFAULT);
insert into pay values (3,'삼성페이',DEFAULT);
insert into pay values (4,'삼성페이',default);
insert into pay values (5,'카드',default);
insert into pay values (6,'카카오페이',default);
insert into pay values (7,'애플페이',default);
insert into pay values (8,'삼성페이',default);
insert into pay values (9,'상품권',default);
insert into pay values (10,'상품권',default);
insert into pay values (11,'네이버페이',default);
insert into pay values (12,'카드',default);
insert into pay values (13,'삼성페이',default);
insert into pay values (14,'삼성페이',default);
insert into pay values (15,'카드',default);
insert into pay values (16,'카카오페이',default);
insert into pay values (17,'애플페이',default);
insert into pay values (18,'삼성페이',default);
insert into pay values (19,'상품권',default);

 

 

중간 과정 보고

 

 

 

과정 4 까진 순조롭게 진행되었다.

( 과정 4번 까지는 어려운 부분이 아니어서 순조로웠다고 생각함 )

13일에 학원에 갔을 때, 추가 기능을 구상하다 

결제 취소와 결제 완료에 대한 포인트 누적 및 좌석 수 반영 트리거를 만들었고 ( 사실 오전 내내 만듦.. 😅 )

 

거기까지 진행하려 했으나 점심이 지났을 때쯤 내 머릿속에 강하게 떠오른 아이디어가 있었다

여러 테이블에 있는 결제정보들을 필요한 정보만 빼와서 뷰를 만든 뒤 

그 뷰로 프로시저를 만들면 어떨까?라는 생각이 문 득 들었다.

그 프로시저로 뭐 할 건데?라는 답변엔 결제를 한 내용에 대해 출력을 띄어주자고 했다

동생들이 프로시저를 배워 본 적이 없어 이해를 못 해서

혼자 무슨 자신감인지 모르겠지만, 내가 만들어서 보여줄게! 하고 큰소리를 쳤다

( 이때의 나 , 반성해라 )

그렇게 나 혼자 만들게 됐는데 이때부터 머리가 아팠다 

사실 나도 프로시저를 예전 학부 때 MSSQL로 1번 해본 게 다였기 때문에. 

오라클은 다를 것 같다는 생각과 사실 잘 모르고 있기 때문에 고민이 되었다.

그래도 만들고 싶은 건 만들어야 되기 때문에 의자에 엉덩이 떼지 않고 수업 종료까지 만들고 있었다.

학원에 남아 2시간 정도 더 하다가 실패를 계속하던 중 내가 쓰는 DBEAVER 프로그램에 

EXEC 출력이 안될 수 있다는 검색을 보고 SQL Developer를 설치했다.

비가 너무 많이 왔고 , 저녁도 늦어서 국밥 한 개 때리고 집에 갔다.

 

 

 

 

프로젝트 과정 5 - 기능 추가를 위한 트리거 만들기 

 

-------------------------------------------------------------------------------------------------------------
-- 					TRIGGER 쿼리 1. 결제 완료 시 포인트 자동 증가 및 잔여 좌석차감 
-------------------------------------------------------------------------------------------------------------
-- TICKETTING 테이블에 새 행이 추가될 때마다 
-- CUSTOMER 테이블의 cos_point를 TICKETTING 테이블의 ti_nop의 명수만큼 포인트 * 100을 하고 
-- TICKETTING 테이블의 ti_nop의 명수만큼 MOVIE_ROUNGE 테이블의 ro_reseet를 자동 차감해주는 트리거 
-- 트리거 명 : upd_cos_point 

CREATE OR REPLACE TRIGGER upd_cos_point
AFTER INSERT ON TICKETTING
FOR EACH ROW
DECLARE
	cnt number;
	s_num number;
BEGIN
	cnt := :NEW.ti_nop;
	s_num := :NEW.sh_num;

-- 포인트 적립 기능
	UPDATE CUSTOMER
	SET cos_point = cos_point + 100 * cnt
	WHERE cos_num = :NEW.cos_num ;

-- 자동 잔여좌석 차감기능 
	UPDATE MOVIE_ROUNGE
	SET re_seet= re_seet-cnt
	WHERE ro_num=(select sh_movien from show_day where sh_num=s_num) ;
END;

-------------------------------------------------------------------------------------------------------------
-- 					TRIGGER 쿼리 2. 결제 취소 시 포인트 자동 차감 및 잔여 좌석 증가  
-------------------------------------------------------------------------------------------------------------
-- TICKETTING 테이블에서 행이 삭제될 때마다 실행되며, 
-- 삭제된 행의 정보를 사용하여 포인트를 복구하고 좌석을 복구합니다. 
-- 포인트는 삭제된 티켓 수에 100을 곱한 만큼 감소하고, 좌석은 삭제된 티켓 수만큼 증가합니다.
-- 트리거명 : upd_reset 

CREATE OR REPLACE TRIGGER upd_reset 
AFTER DELETE ON TICKETTING
FOR EACH ROW
DECLARE
    cnt number;
    s_num number;
BEGIN
    cnt := :OLD.ti_nop;
    s_num := :OLD.sh_num;

    -- 포인트 복구 기능
    UPDATE CUSTOMER
    SET cos_point = cos_point - 100 * cnt
    WHERE cos_num = :OLD.cos_num ;

    -- 자동 잔여좌석 복구 기능
    UPDATE MOVIE_ROUNGE
    SET re_seet = re_seet + cnt
    WHERE ro_num = (SELECT sh_movien FROM show_day WHERE sh_num = s_num);
END;

 

 

성공하다 - 그것은 바로 프로시저 

 

집에 와서 차분히 다시 자료를 찾아보았다.

그러다.. 정말.. 눈물 나게  밤 10시가 되어! 드디어 성공하였다.

뷰는 솔직히 1분도 안돼서 만들었지만

하루 종일 프로시저로 골머릴 썩고 있었던 나로선 진짜 눈물 날 뻔했다.

 

 

그때의 기쁨을 조원들에게 바로 뿌려주기

 

 

 

 

 

프로젝트 과정 6 - 뷰 기능 추가 

 

 

-------------------------------------------------------------------------------------------------------------
-- 					VIEW 쿼리 1. 결제 내역을 모아서 구성해놓은 뷰 쿼리  
-------------------------------------------------------------------------------------------------------------


CREATE OR REPLACE VIEW EW_pay_info
AS
 	SELECT p.ti_num T_NUM, c.cos_name T_NAMES , s.sh_time T_TIMES
        , m.mo_title M_TITLES , p.py_type P_TYPES , (t.ti_nop)*p.py_tot P_TOPAY
	FROM pay p
	JOIN ticketting t ON p.ti_num = t.ti_num
	JOIN customer c ON t.cos_num = c.cos_num
	JOIN show_day s ON t.sh_num = s.sh_num
	JOIN movie m ON s.sh_movien = m.mo_num ; 


SELECT * FROM EW_pay_info;

 

 

 

 

 

프로젝트 과정 7 - 출력 프로시저 만들기 

 

 

-------------------------------------------------------------------------------------------------------------
-- 					PROCEDURE 쿼리 1. pay 테이블의 결제 번호를  입력시 결제 정보 자동 호출 기능   
-------------------------------------------------------------------------------------------------------------

SET SERVEROUTPUT ON;  -- 출력창 활성화

-------------------------------------------------------------------------------------------------------------
--				PROCEDURE 쿼리 1. pay 테이블의 결제 번호를  입력시 결제 정보 자동 호출 기능   
-------------------------------------------------------------------------------------------------------------
/*											payProc 프로시저 설명 
 

CREATE 구문중 ()괄호 안에 있는 pay_no는 입력 파라미터 입니다.
특정 프로시저를 호출 할때 입력 받을 파라미터를 먼저 지정해 주어야 됩니다.
AS 구문 뒤에는 출력할 매개변수들의 데이터 타입과 변수명을 지정해 줍니다.
begin ~ end 사이의 구문은 실제 처리할 내용들을 적습니다.
select ~ into 구문을 사용하여 EM_pay_info 뷰
별칭 T_NUM, T_NAMES, T_TIMES, M_TITLES, P_TYPE, P_TOPAY를 각각
선언한 변수에 넣어줍니다.
DBMS_OUTPUT.PUT_LINE 을 사용 하여 해당 변수에 들어간 값을 출력하도록 지정해 놓습니다.
해당 프로시저를 사용할 때엔 지정해놓은 매개변수를 이용하여 
뷰의 T_NUM을 넣어주었을때 
해당 일치된 NUM의 결제정보를 화면에 출력해줍니다.
프로시저는 학원에서 배운 영역은 아니지만. 트리거와 자료를 찾다보니 알게되어 사용해 보았습니다.
저장 프로시저같은 경우 다른 외부 값을 받아 펑션처럼 처리도 할 수 있고
리턴값을 출력해주는 기능 등 다양한 기능이 있어 알아두면 좋을 것 같습니다
아직 해당 프로시저라는 개념을 100% 핸들링 하지는 못하지만 
이번 기회에 활용해보아서 너무 뿌듯합니다

*/-------------------------------------------------------------------------------------------------------------


CREATE OR REPLACE PROCEDURE payProc 
(
    pay_no IN EW_pay_info.T_NUM%TYPE
)
AS 
    v_payNUMBER NUMBER;
    v_payNAME varchar2(20);
    v_payTIME DATE;
    v_payTITLE varchar2(50);
    v_payTYPE varchar2(20);
    v_payTOPAY NUMBER;
begin
    SELECT T_NUM into v_payNUMBER from EW_pay_info WHERE T_NUM=pay_no;
    SELECT T_NAMES into v_payNAME from EW_pay_info WHERE T_NUM=pay_no;
    SELECT T_TIMES into v_payTIME from EW_pay_info WHERE T_NUM=pay_no;
    SELECT M_TITLES into v_payTITLE from EW_pay_info WHERE T_NUM=pay_no;
    SELECT P_TYPES into v_payTYPE from EW_pay_info WHERE T_NUM=pay_no;
    SELECT P_TOPAY into v_payTOPAY from EW_pay_info WHERE T_NUM=pay_no;
    
    DBMS_OUTPUT.PUT_LINE('-------- 결제 완료 --------');
    DBMS_OUTPUT.PUT_LINE('티켓번호 : ' || v_payNUMBER);
    DBMS_OUTPUT.PUT_LINE('회원이름 : ' || v_payNAME);
    DBMS_OUTPUT.PUT_LINE('상영날짜 : ' || v_payTIME);
    DBMS_OUTPUT.PUT_LINE('영화이름 : ' || v_payTITLE);
    DBMS_OUTPUT.PUT_LINE('결제타입 : ' || v_payTYPE);
    DBMS_OUTPUT.PUT_LINE('결제총액 : ' || v_payTOPAY);
END payProc ;

 

 

 


 

반응형
유리쯔의일상