학원 44일차 - Oracle

2021.05.28

ex29_plsql.sql

반복문

  1. loop
  • 무한 루프
  • 탈출 조건 처리
  1. for loop
  • 지정 횟수 반복(자바 for문 유사)
  1. while loop
  • 조건 반복(자바 while문 유사)

loop

set serveroutput on;

begin
    -- 무한루프
    loop
        dbms_output.put_line(to_char(sysdate, 'hh24:mi:ss'));
    end loop;
    
end;
declare
    vnum number := 1; -- 루프 변수 역할
begin

    loop
    
        dbms_output.put_line(vnum);
        vnum := vnum + 1;
        
        -- 자바라면 if에서 + break 걸어서 멈춤
        -- exit when 조건; -- 조건을 만족하면 멈춤
        exit when vnum > 10;
    
    end loop;

end;
-- 테이블 생성
create table tblLoop (
    seq number primary key,
    data varchar2(30) not null
);

create sequence seqLoop;


-- 더미 데이터 + 10000개 추가
-- data: '데이터1', '데이터2', '데이터3'..

declare
    vnum number := 1;
begin
    loop
    
        insert into tblLoop (seq, data) values (seqLoop.nextVal, '데이터' || vnum);
        vnum := vnum + 1;
        
        exit when vnum > 10000;
        
    end loop;
end;

select * from tblLoop;

delete from tblLoop;
declare
    vname tblInsa.name%type;
    vnum number;
begin
    
    -- tblInsa. 직원번호 1015 ~ 1045. 이름. tblLoop 추가
    vnum := 1015;
    
    loop
    
        -- 1. 직원번호를 조건으로 이름가져오기
        select name into vname from tblInsa where num = vnum;
        
        -- 2.
        insert into tblLoop (seq, data) values (seqLoop.nextVal, vname);
        
        vnum := vnum + 1;
        
        exit when vnum > 1045;        
    
    end loop;
    
end;

select * from tblLoop;

for loop

-- for loop
begin
    
    -- i: 루프변수
    -- in: 연결 키워드 (향상된for문의 :와 같은 역할)
    -- 1: 초기값
    -- 10: 최대값
    -- ..: 증가
    -- for 제어조건 loop
    for i in 1..10 loop
        
        dbms_output.put_line(i);
        
        -- PLS-00363: expression 'I' cannot be used as an assignment target
        -- i := i + 1;
    
    end loop;
    
    
--    for i in reverse 1..10 loop -- reverse : 역순으로 돈다.
--        
--        dbms_output.put_line(i);
--    
--    end loop;

end;
-- 구구단
-- 테이블 생성
create table tblGugudan (
    -- ORA-02260: table can have only one primary key -- PK는 하나만 가질 수 있다.
    -- dan number not null primary key,
    -- num number not null primary key,
    
    dan number not null,
    num number not null,
    result number not null,
    
    -- 컬럼 수준에서 선언
    -- constraint 제약사항이름 primary key(컬럼, 컬럼)
    constraint tblgugudan_dan_num_pk primary key(dan, num) -- 복합키★★
);

-- 테이블 밖 외부에서 제약사항 선언(수정)
alter table tblGugudan
    add constraint tblgugudan_dan_num_pk primary key(dan, num); -- 이 방법 선호★★


-- 2단 ~ 9단 : insert x 72번
-- 변수가 필요 없어서 declare 생략
begin
    
    for vdan in 2..9 loop
        
        for vnum in 1..9 loop
            
            insert into tblGugudan (dan, num, result)
                values (vdan, vnum, vdan * vnum); -- 컬럼명과 변수명을 구분지어주는 것이 좋음(가독성)
        
        end loop;
    
    end loop;
    
end;


select * from tblGugudan;
declare
    vname tblInsa.name%type;
begin
    
    for vnum in 1030..1040 loop
    
        select name into vname from tblInsa where num = vnum;
        
        insert into tblLoop (seq, data) values (seqLoop.nextVal, vname);
    
    end loop;
    
end;

select * from tblLoop;

while loop

-- while loop
declare
    vnum number := 1;
begin

    -- while 조건 loop
    while vnum <= 10 loop -- 11이 되는 순간 루프를 빠져나옴
    
        dbms_output.put_line(vnum);
        vnum := vnum + 1;
        
    end loop;

end;

예외 처리부

-- 예외 처리부 
declare
    vnum number;
    vname number;
begin

    dbms_output.put_line('시작');
    
    -- ORA-06502: PL/SQL: numeric or value error: character to number conversion error -- 자료형이 다름
    select name into vname from tblInsa where num = 1001;
    dbms_output.put_line(vname);
    
    -- vnum := 10;
    vnum := 0;
    
    -- ORA-01476: divisor is equal to zero -- 0으로 나눌 수 없음
    dbms_output.put_line(100 / vnum);
    
    dbms_output.put_line('끝');

exception
    -- catch절. 예외 처리부
    
    when VALUE_ERROR then
        dbms_output.put_line('자료형 불일치');
    
    when zero_divide then
        dbms_output.put_line('0으로 나누려고 함');
    
    when others then -- catch (Exception e) : 모든 종류의 예외 처리, PL/SQL은 순서가 있기 때문에 모든 에러처리구문은 마지막에 한다.
        dbms_output.put_line('예외처리'); 

end;
  • 에러 도움말 사이트

Errors and Exception Handling (oracle.com)

좋은 웹페이지 즐겨찾기