학원 44일차 - Oracle
2021.05.28
ex29_plsql.sql
반복문
- loop
- 무한 루프
- 탈출 조건 처리
- for loop
- 지정 횟수 반복(자바 for문 유사)
- 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;
- 에러 도움말 사이트
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
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
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)
Author And Source
이 문제에 관하여(학원 44일차 - Oracle), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hi-dae-in/학원-44일차-Oracle저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)