일종의 스타리그 시작부터 끝까지 PL/SQL 시나리오로 짜봤다
순서는..
 
1. 대회관리인이 인증번호 입력해서 데이터베이스에 들어오고
2. 새로운 대회를 입력한다
3. 각종 듀얼토너먼트를 시작으로 ABCD조에 각각 4명씩 총 16명의 선수를 넣는다
4. 경기가 끝날때마다 각각의 시합정보는 match 테이블에 자동으로 입력된다
5. 선수 승점을 매번확인한다
6. 16명중 8명의 선수를 8강에 입력시킨다
7. 8명의 선수중 4명을 4강으로 입력시킨다
8. 4명의 선수중 2명을 결승에 입력시킨다
9. 결승 후 결승자와 준우승자를 가리고 자동적으로 league 테이블에 값이 들어간다
10. 대회출전한 16명의 총 결과를 모두다 보여준다
 
 
다시 세부사항으로...
 
 
1. 대회관리인이 인증번호 입력해서 데이터베이스에 들어오고
 
CREATE OR REPLACE PROCEDURE sin_pass
(p_control_management IN control.control_management%TYPE,
p_control_pass IN control.control_pass%TYPE )
IS
v_control_pass control.control_pass%type ;
BEGIN
DBMS_OUTPUT.ENABLE;
SELECT control_pass INTO v_control_pass FROM control
WHERE control_management = p_control_management ;
IF v_control_pass = p_control_pass THEN
DBMS_OUTPUT.PUT_LINE(p_control_management||'님 환영합니다');
ELSE
DBMS_OUTPUT.PUT_LINE('인증되지 않은 사용자입니다');
END IF ;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END ;
/
 
exec sin_pass('이대회',3333);
exec sin_pass('이대회',4444);
 
2. 새로운 대회를 입력한다
 
CREATE OR REPLACE PROCEDURE sin_insert_league
(p_name IN league.league_name%TYPE,
p_location IN league.league_location%TYPE,
p_sponsor IN league.league_sponsor%TYPE,
p_final_money IN league.league_final_money%TYPE,
p_semifinal_money IN league.league_semifinal_money%TYPE,
p_type IN league.league_type%TYPE)
IS
BEGIN
DBMS_OUTPUT.ENABLE;
INSERT INTO league(league_name,league_location,league_sponsor,
league_final_money,league_semifinal_money,league_type)
values(p_name,p_location,p_sponsor,
p_final_money,p_semifinal_money,p_type);
 
DBMS_OUTPUT.PUT_LINE('대회이름:'||p_name);
DBMS_OUTPUT.PUT_LINE('대회장소:'||p_location);
DBMS_OUTPUT.PUT_LINE('대회후원:'||p_sponsor);
DBMS_OUTPUT.PUT_LINE('대회우승상금:'||p_final_money);
DBMS_OUTPUT.PUT_LINE('대회준우승상금:'||p_semifinal_money);
DBMS_OUTPUT.PUT_LINE('대회종류:'||p_type);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
 
END;
/
 
exec sin_insert_league('신한은행배스타리그','대전','신한은행',30000000,15000000,'개인전');
 
 
 
CREATE OR REPLACE TRIGGER league_trigger
BEFORE
INSERT on league
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('새로 생성된 스타리그'||:new.league_name);
DBMS_OUTPUT.PUT_LINE('새로 생성된 우승상금'||:new.league_final_money);
DBMS_OUTPUT.PUT_LINE('새로 생성된 준우승상금'||:new.league_semifinal_money);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
 
 
3. 각종 듀얼토너먼트를 시작으로 ABCD조에 각각 4명씩 총 16명의 선수를 넣는다
 
CREATE OR REPLACE PROCEDURE sin_insert_gamer
(p_sin16_name1 IN sinhanbank.sin16_name%TYPE,
p_sin16_name2 IN sinhanbank.sin16_name%TYPE,
p_sin16_name3 IN sinhanbank.sin16_name%TYPE,
p_sin16_name4 IN sinhanbank.sin16_name%TYPE,
p_sin16_group IN sinhanbank.sin16_group%TYPE)
IS
p_sin16_main1 progamer.gamer_main%TYPE;
p_sin16_main2 progamer.gamer_main%TYPE;
p_sin16_main3 progamer.gamer_main%TYPE;
p_sin16_main4 progamer.gamer_main%TYPE;
BEGIN
DBMS_OUTPUT.ENABLE;
 
SELECT gamer_main INTO p_sin16_main1 FROM progamer
             where gamer_name=p_sin16_name1;
SELECT gamer_main INTO p_sin16_main2 FROM progamer
             where gamer_name=p_sin16_name2;
SELECT gamer_main INTO p_sin16_main3 FROM progamer
             where gamer_name=p_sin16_name3;
SELECT gamer_main INTO p_sin16_main4 FROM progamer
             where gamer_name=p_sin16_name4;
 
UPDATE sinhanbank SET sin16_name=p_sin16_name1, sin16_main=p_sin16_main1
 where sin16_num=1 and sin16_group=p_sin16_group;
UPDATE sinhanbank SET sin16_name=p_sin16_name2, sin16_main=p_sin16_main2
 where sin16_num=2 and sin16_group=p_sin16_group;
UPDATE sinhanbank SET sin16_name=p_sin16_name3, sin16_main=p_sin16_main3
 where sin16_num=3 and sin16_group=p_sin16_group;
UPDATE sinhanbank SET sin16_name=p_sin16_name4, sin16_main=p_sin16_main4
 where sin16_num=4 and sin16_group=p_sin16_group;
 
DBMS_OUTPUT.PUT_LINE(p_sin16_group||'조 명단');
DBMS_OUTPUT.PUT_LINE('첫번째선수:'||p_sin16_name1 || p_sin16_main1);
DBMS_OUTPUT.PUT_LINE('두번째선수:'||p_sin16_name2 || p_sin16_main2);
DBMS_OUTPUT.PUT_LINE('세번째선수:'||p_sin16_name3 || p_sin16_main3);
DBMS_OUTPUT.PUT_LINE('네번째선수:'||p_sin16_name4 || p_sin16_main4);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
 
END;
/
 
exec sin_insert_gamer('오영종','박지호','서지훈','한동욱','A');
exec sin_insert_gamer('임요환','박성준P','변형태','송병구','B');
exec sin_insert_gamer('최연성','안기효','김근백','차재욱','C');
exec sin_insert_gamer('전상욱','김성제','이병민','박성준K','D');
 
 
4. 경기가 끝날때마다 각각의 시합정보는 match 테이블에 자동으로 입력된다
 
CREATE OR REPLACE PROCEDURE sin_match16
(p_sin16_name1 IN sinhanbank.sin16_name%TYPE,
p_sin16_name2 IN sinhanbank.sin16_name%TYPE,
p_sin16_winner IN sinhanbank.sin16_name%TYPE,
p_sin16_map IN map.map_name%TYPE,
p_sin16_time IN match.match_time%TYPE)
IS
BEGIN
insert into match values(match_id_seq.nextval, SYSDATE,
p_sin16_name1,p_sin16_name2, p_sin16_map, p_sin16_time ,p_sin16_winner);
 
update sinhanbank set sin16_win=sin16_win+1 where sin16_name=p_sin16_winner;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
A조
exec sin_match16('오영종','박지호','오영종','개척시대',22);
exec sin_match16('서지훈','한동욱','서지훈','러쉬아워2',31);
exec sin_match16('오영종','서지훈','서지훈','Ride_of_valkyries',15);
exec sin_match16('박지호','한동욱','박지호','Ride_of_valkyries',42);
exec sin_match16('한동욱','오영종','오영종','신815',28);
exec sin_match16('박지호','서지훈','서지훈','신815',21);
 
B조
exec sin_match16('박성준P','변형태','박성준P','러쉬아워2',31);
exec sin_match16('임요환','송병구','임요환','Ride_of_valkyries',24);
exec sin_match16('송병구','변형태','송병구','신815',42);
exec sin_match16('임요환','박성준P','박성준P','신815',35);
exec sin_match16('송병구','박성준P','박성준P','개척시대',41);
exec sin_match16('변형태','임요환','임요환','개척시대',13);
 
C조
exec sin_match16('최연성','김근백','최연성','Ride_of_valkyries',38);
exec sin_match16('차재욱','안기효','안기효','신815',28);
exec sin_match16('최연성','차재욱','최연성','개척시대',42);
exec sin_match16('김근백','안기효','김근백','개척시대',19);
exec sin_match16('안기효','최연성','최연성','러쉬아워2',30);
exec sin_match16('김근백','차재욱','김근백','러쉬아워2',33);
 
D조
exec sin_match16('김성제','박성준K','김성제','신815',21);
exec sin_match16('전상욱','이병민','전상욱','개척시대',28);
exec sin_match16('이병민','박성준K','이병민','러쉬아워2',24);
exec sin_match16('전상욱','김성제','전상욱','러쉬아워2',32);
exec sin_match16('이병민','김성제','김성제','Ride_of_valkyries',31);
exec sin_match16('박성준K','전상욱','전상욱','Ride_of_valkyries',16);
 
 
CREATE OR REPLACE PROCEDURE sin_match8
(p_sin16_name1 IN sinhanbank.sin16_name%TYPE,
p_sin16_name2 IN sinhanbank.sin16_name%TYPE,
p_sin16_winner IN sinhanbank.sin16_name%TYPE,
p_sin16_map IN map.map_name%TYPE,
p_sin16_time IN match.match_time%TYPE)
IS
BEGIN
insert into match values(match_id_seq.nextval, SYSDATE,
p_sin16_name1,p_sin16_name2, p_sin16_map, p_sin16_time ,p_sin16_winner);
 
update sinhanbank set sin8_win=sin8_win+1 where sin16_name=p_sin16_winner;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
 
END;
/
 
 
exec sin_match8('오영종','서지훈','오영종','신815',21);
exec sin_match8('오영종','서지훈','서지훈','개척시대',28);
exec sin_match8('오영종','서지훈','서지훈','러쉬아워2',24);
exec sin_match8('임요환','박성준P','박성준P','러쉬아워2',32);
exec sin_match8('임요환','박성준P','임요환','개척시대',17);
exec sin_match8('임요환','박성준P','박성준P','Ride_of_valkyries',22);
exec sin_match8('최연성','김근백','최연성','Ride_of_valkyries',31);
exec sin_match8('최연성','김근백','김근백','개척시대',28);
exec sin_match8('최연성','김근백','김근백','신815',21);
exec sin_match8('전상욱','김성제','김성제','Ride_of_valkyries',16); 
exec sin_match8('전상욱','김성제','전상욱','개척시대',28);
exec sin_match8('전상욱','김성제','전상욱','러쉬아워2',24);
 
 
 
CREATE OR REPLACE PROCEDURE sin_match4
(p_sin16_name1 IN sinhanbank.sin16_name%TYPE,
p_sin16_name2 IN sinhanbank.sin16_name%TYPE,
p_sin16_winner IN sinhanbank.sin16_name%TYPE,
p_sin16_map IN map.map_name%TYPE,
p_sin16_time IN match.match_time%TYPE)
IS
BEGIN
insert into match values(match_id_seq.nextval, SYSDATE,
p_sin16_name1,p_sin16_name2, p_sin16_map, p_sin16_time ,p_sin16_winner);
update sinhanbank set sin4_win=sin4_win+1 where sin16_name=p_sin16_winner;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
 
END;
/
 
exec sin_match4('서지훈','박성준P','서지훈', '신815',21);
exec sin_match4('서지훈','박성준P','박성준P','개척시대',28);
exec sin_match4('서지훈','박성준P','서지훈','러쉬아워2',24);
exec sin_match4('서지훈','박성준P','박성준P'','러쉬아워2',32);
exec sin_match4('서지훈','박성준P','서지훈','개척시대',17);
 
exec sin_match4('전상욱','김근백','전상욱','Ride_of_valkyries',31);
exec sin_match4('전상욱','김근백','김근백','개척시대',28);
exec sin_match4('전상욱','김근백','김근백','신815',21);
exec sin_match4('전상욱','김근백','전상욱','Ride_of_valkyries',16); 
exec sin_match4('전상욱','김근백','전상욱','개척시대',28);
 
 
CREATE OR REPLACE PROCEDURE sin_match2
(p_sin16_name1 IN sinhanbank.sin16_name%TYPE,
p_sin16_name2 IN sinhanbank.sin16_name%TYPE,
p_sin16_winner IN sinhanbank.sin16_name%TYPE,
p_sin16_map IN map.map_name%TYPE,
p_sin16_time IN match.match_time%TYPE)
IS
BEGIN
insert into match values(match_id_seq.nextval, SYSDATE,
p_sin16_name1,p_sin16_name2, p_sin16_map, p_sin16_time ,p_sin16_winner);
update sinhanbank set sin2_win=sin2_win+1 where sin16_name=p_sin16_winner;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
exec sin_match2('전상욱','서지훈','전상욱','Ride_of_valkyries',31);
exec sin_match2('전상욱','서지훈','서지훈','개척시대',28);
exec sin_match2('전상욱','서지훈','서지훈','신815',21);
exec sin_match2('전상욱','서지훈','전상욱','Ride_of_valkyries',16); 
exec sin_match2('전상욱','서지훈','전상욱','개척시대',28);
 
5. 선수 승점을 매번확인한다
 
CREATE OR REPLACE PROCEDURE sin_viewpoint
(p_sin16_group IN sinhanbank.sin16_group%TYPE)
IS
TYPE sin16win_table IS TABLE OF sinhanbank.sin16_win%TYPE
INDEX BY BINARY_INTEGER;
TYPE sin16name_table IS TABLE OF sinhanbank.sin16_name%TYPE
INDEX BY BINARY_INTEGER;
sin16win_tab sin16win_table;
sin16name_tab sin16name_table;
i BINARY_INTEGER:=0;    
 
BEGIN
DBMS_OUTPUT.ENABLE;
 
FOR sin16win_list IN(SELECT sin16_win,sin16_name FROM sinhanbank where sin16_group=p_sin16_group)
LOOP
i:=i+1;
sin16win_tab(i):=sin16win_list.sin16_win;
sin16name_tab(i):=sin16win_list.sin16_name;
END LOOP;
FOR CNT IN 1..i LOOP
DBMS_OUTPUT.PUT_LINE('이름:'||sin16name_tab(cnt));
DBMS_OUTPUT.PUT_LINE('승점:'||sin16win_tab(cnt));
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
exec sin_viewpoint('A');
exec sin_viewpoint('B');
exec sin_viewpoint('C');
exec sin_viewpoint('D');
 
 
6. 16명중 8명의 선수를 8강에 입력시킨다
 
CREATE OR REPLACE PROCEDURE sin_go8
(p_sin16_name1 IN sinhanbank.sin16_name%TYPE,
p_sin16_name2 IN sinhanbank.sin16_name%TYPE,
p_sin16_group IN sinhanbank.sin16_group%TYPE)
 
IS
BEGIN
 
UPDATE sinhanbank SET final_result='8강진출' where sin16_name=p_sin16_name1;
UPDATE sinhanbank SET final_result='8강진출' where sin16_name=p_sin16_name2;
 
DBMS_OUTPUT.PUT_LINE(p_sin16_group||' 8강확정');
DBMS_OUTPUT.PUT_LINE(p_sin16_group||' 1'||p_sin16_name1);
DBMS_OUTPUT.PUT_LINE(p_sin16_group||' 2'||p_sin16_name2);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
 
exec sin_go8('서지훈','오영종','A');
exec sin_go8('박성준P','임요환','B');
exec sin_go8('최연성','김근백','C');
exec sin_go8('전상욱','김성제','D');
 
 
7. 8명의 선수중 4명을 4강으로 입력시킨다
 
CREATE OR REPLACE PROCEDURE sin_go4
(p_sin16_group IN sinhanbank.sin16_group%TYPE)
IS
v_sin8_win sinhanbank.sin8_win%TYPE;
v_sin16_name sinhanbank.sin16_name%TYPE;
BEGIN
select sin8_win,sin16_name INTO v_sin8_win,v_sin16_name from sinhanbank where sin8_win =
(select MAX(sin8_win) from sinhanbank where sin16_group=p_sin16_group) and sin16_group=p_sin16_group;
UPDATE sinhanbank SET final_result='4강진출' where sin8_win=v_sin8_win and sin16_group=p_sin16_group;
DBMS_OUTPUT.PUT_LINE(p_sin16_group||' 1'||v_sin16_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
exec sin_go4('A');
exec sin_go4('B');
exec sin_go4('C');
exec sin_go4('D');
 
 
8. 4명의 선수중 2명을 결승에 입력시킨다
 
 
CREATE OR REPLACE PROCEDURE sin_go2
(p_sin16_group1 IN sinhanbank.sin16_group%TYPE,
p_sin16_group2 IN sinhanbank.sin16_group%TYPE)
IS
v_sin4_win1 sinhanbank.sin8_win%TYPE;
v_sin4_win2 sinhanbank.sin4_win%TYPE;
v_sin16_name1 sinhanbank.sin16_name%TYPE;
v_sin16_name2 sinhanbank.sin16_name%TYPE;
BEGIN
select sin4_win,sin16_name INTO v_sin4_win1,v_sin16_name1 from sinhanbank where sin4_win =(select MAX(sin4_win) from sinhanbank where sin16_group=p_sin16_group1) and sin16_group=p_sin16_group1;
select sin4_win,sin16_name INTO v_sin4_win2,v_sin16_name2 from sinhanbank where sin4_win =(select MAX(sin4_win) from sinhanbank where sin16_group=p_sin16_group2) and sin16_group=p_sin16_group1;
 
if v_sin4_win1 > v_sin4_win2 then
UPDATE sinhanbank SET final_result='결승진출' where sin4_win=v_sin4_win1
and sin16_group=p_sin16_group1;
DBMS_OUTPUT.PUT_LINE('결승진출'|| p_sin16_group1 || v_sin16_name1);
else
UPDATE sinhanbank SET final_result='결승진출' where sin4_win=v_sin4_win2 and
sin16_group=p_sin16_group2;
DBMS_OUTPUT.PUT_LINE('결승진출'||p_sin16_group2 || v_sin16_name2);
end if;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
exec sin_go2('A','B');
exec sin_go2('C','D');
 
 
9. 결승 후 결승자와 준우승자를 가리고 자동적으로 league 테이블에 값이 들어간다
 
CREATE OR REPLACE PROCEDURE sin_final
IS
v_sin2_win1 sinhanbank.sin2_win%TYPE;
v_sin2_win2 sinhanbank.sin2_win%TYPE;
v_sin16_name1 sinhanbank.sin16_name%TYPE;
v_sin16_name2 sinhanbank.sin16_name%TYPE;
BEGIN
select sin2_win,sin16_name INTO v_sin2_win1,v_sin16_name1 from sinhanbank
where sin2_win =(select MAX(sin2_win) from sinhanbank where sin16_group IN ('A','B'));
select sin2_win,sin16_name INTO v_sin2_win2,v_sin16_name2 from sinhanbank
where sin2_win =(select MAX(sin2_win) from sinhanbank where sin16_group IN ('C','D'));
if v_sin2_win1 > v_sin2_win2 then
UPDATE sinhanbank SET final_result='우승자' where sin2_win=v_sin2_win1;
UPDATE sinhanbank SET final_result='준우승자' where sin2_win=v_sin2_win2;
UPDATE league SET league_final=v_sin16_name1 where league_name='신한은행배스타리그';
UPDATE league SET league_semifinal=v_sin16_name2 where league_name='신한은행배스타리그';
DBMS_OUTPUT.PUT_LINE('우승자'|| v_sin16_name1);
DBMS_OUTPUT.PUT_LINE('준우승자'|| v_sin16_name2);
else
UPDATE sinhanbank SET final_result='우승자' where sin2_win=v_sin2_win2;
UPDATE sinhanbank SET final_result='준우승자' where sin2_win=v_sin2_win1;
UPDATE league SET league_final=v_sin16_name2 where league_name='신한은행배스타리그';
UPDATE league SET league_semifinal=v_sin16_name1 where league_name='신한은행배스타리그';
DBMS_OUTPUT.PUT_LINE('우승자'|| v_sin16_name2);
DBMS_OUTPUT.PUT_LINE('준우승자'|| v_sin16_name1);
end if;
 
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
exec sin_final;
 
 
10. 대회출전한 16명의 총 결과를 모두다 보여준다
 
 
CREATE OR REPLACE PROCEDURE sin_info
IS
CURSOR sin_info IS
select sin16_name, sin16_main, final_result, sin16_win+sin8_win+sin4_win+sin2_win AS total_point from sinhanbank;
BEGIN
FOR sin_list IN sin_info LOOP
DBMS_OUTPUT.PUT_LINE('프로게이머 이름 = '||sin_list.sin16_name);
DBMS_OUTPUT.PUT_LINE('프로게이머 주종족 = '||sin_list.sin16_main);
DBMS_OUTPUT.PUT_LINE('프로게이머 승점= '||sin_list.total_point);
DBMS_OUTPUT.PUT_LINE('프로게이머 최종결과 = '||sin_list.final_result);
DBMS_OUTPUT.PUT_LINE('------------');
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE:'||to_char(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE:'||SQLERRM);
END;
/
 
exec sin_info;
Posted by 용학도리
,