Goals
- PL/SQL의 데이터 타입
- 행/열 참조 변수 타입 선언
- 조건문 : IF, CASE ~ WHEN 구문
- 반복문 : LOOP, FOR, WHILE, EXIT, CONTINUE
- PL/SQL 시작시, dbms_random.value()
Notes
- PL/SQL의 데이터 타입
1) Scalar(스칼라) 타입 : number, varchar2, date ... 하나의 데이터 타입만 저장함
2) Reference(참조) 타입 : 특정 테이블의 행(Row)이나 열(Column)을 참조하는 타입
3) Compound(복합) 타입 : collection(Column 데이터의 모음), record(Row 데이터의 모음) 여러 종류의 데이터 타입을 저장함
컬럼 참조 타입 변수 선언 : 변수이름 테이블이름 컬럼이름 %type := 값.
행 참조 타입 변수 선언 : 변수이름 테이블이름'%rowtype" = 값
EX)
declare
-- dept 테이블의 각 칼럼의 값들을 저장할 수 있는 변수 선언.
v_deptno dept.deptno%type := 10;
v_dname dept.dname%type;
v_loc dept.loc%type;
begin
select dname, loc into v_dname, v_loc
from dept where deptno=v_deptno;
dbms_output.put_line(v_deptno || ' : ' || v_dname || ' : ' || v_loc);
end;
declare
-- emp 테이블의 행row 의 모든 정보를 저장할 수 있는 변수를 선언
v_emp7788 emp%rowtype;
begin
select * into v_emp7788
from emp where empno = 7788;
dbms_output.put_line(v_emp7788.ename);
dbms_output.put_line(v_emp7788.sal);
end;
/
- IF 조건문(Conditional Statement)
(I)조건식이 1개일 경우
IF 조건식 THEN
조건식이 참일 때 실행할 문장;
END IF;
(II) 조건식이 2개일 경우
IF 조건식 THEN
조건식이 참일 때 실행할 문장;
ELSE
조건식이 거짓일 때 실행할 문장;
END IF;
(III) 조건이 n개일 경우
IF 조건식1 THEN
조건식1이 참일 때 실행할 문장;
ELSIF 조건식2 THEN
조건식2가 참일 때 실행할 문장;
...
ELSE
조건식이 모두 거짓일 때 실행할 문장;
END IF;
EX)
accept p_num prompt '숫자 입력 : ';
declare
v_num number := &p_num ;
begin
if mod(v_num, 3) = 0 then
dbms_output.put_line('나머지 0');
elsif mod(v_num, 3) = 1 then
dbms_output.put_line('나머지 1');
else dbms_output.put_line('나머지 2');
end if;
dbms_output.put_line('End PL/SQL');
end;
- CASE ~ WHEN 구문 - 2가지 방법이 있음.
(1)(=)같다 만 조건문으로 활용할 수 있다.
CASE 비교대상
WHEN 값1 THEN
비교대상 = 값 1을 만족할 때 실행할 문장;
WHEN 값2 THEN
비교대상 = 값 1을 만족할 때 실행할 문장;
....
ELSE 비교대상이 위의 모든 값과 일치하지 않을 때 실행할 문장
END CASE;
(2)
CASE
WHEN 조건식1 THEN
조건식1이 참일 때 실행할 문장;
WHEN 조건식2 THEN
조건식2가 참일 때 실행할 문장;
...
ELSE 위의 모든 조건이 거짓일 때 실행할 문장;
END CASE;
(1) LOOP
LOOP
반복할 문장;
EXIT WHEN 조건식;
END LOOP
EX)
DECLARE
v_num number:= 1;
BEGIN
loop
dbms_output.put_line('v_num='||v_num);
v_num := v_num+1;
exit when (v_num=10);
end loop;
END;
(2) WHILE LOOP
WHILE 조건식 LOOP
조건이 참일 때 반복할 문장;
END LOOP; FALSE가 되면 종료한다
EX)
DECLARE
v_num number := 1;
BEGIN
while v_num<6 loop
dbms_output.put_line('v_num = '||v_num);
v_num := v_num+1;
end loop;
END;
(3) FOR LOOP
FOR 변수 IN REVERSE 시작값 .. 마지막값 LOOP
반복할 문장;
END LOOP;
-- FOR-LOOP에서 사용하는 변수는 DECLARE 구분에서 선언하지 않음!
-- FOR-LOOP에서 사용하는 변수는 LOOP가 반복할 때마다 자동으로 1씩 증가한다.
EX)
begin
for i in 1..9 loop
DBMS_OUTPUT.PUT_LINE ('3 x '|| i || ' = ' || 3*i);
end loop;
end;
FOR LOOP 변수를 감소시키면서 반복하기 - REVERSE
FOR 변수 IN REVERSE 시작값 .. 마지막값 LOOP
반복할 문장;
END LOOP;
(4) LOOP, WHILE, FOR 안에서
EXIT WHEN 조건식 : 조건식을 맍고하는 경우에 반복문을 종료.
EX) -- 4에서 끝남
declare
v_num number := 1;
begin
while v_num <10 loop
dbms_output.put_line('v_num = '|| v_num);
v_num := v_num +1;
exit when v_num = 5;
end loop;
end;
(5) FOR에서 EXIT 사용하기
EX) --5에서 끝남
BEGIN
FOR i in 1..10 loop
dbms_output.put_line('i = '|| i);
exit when i = 5;
end loop;
end;
- CONTINUE WHEN : 조건식을 만족하는 경우 반복문의 시작부분으로 돌아감.
--> 조건을 만족하면 반복문의 다음번을 시작하라.
EX)
BEGIN
FOR I IN 1..10 LOOP
continue when mod(i,2)=0;
dbms_output.put_line(i);
end loop;
end;
결과 : 1, 3, 5, 7, 9
BEGIN
for i in 0..4 loop
dbms_output.put_line(2*i+1);
end loop;
END; -- 이렇게 하면 코드 이해가 더 쉽다.
'DB > Oracle' 카테고리의 다른 글
Oracle DB11_ 반복문 연습문제2 (0) | 2019.10.01 |
---|---|
Oracle DB10_조건문/반복문 연습문제 (0) | 2019.09.30 |
Oracle DB9_PL/SQL 시작 (0) | 2019.09.26 |
Oracle DB8_DDM, SEQUENCE시퀀스 (0) | 2019.09.25 |
Oracle DB7_DDL, DML, 제약조건, EXCEL문서 SQL에 삽입하기 (0) | 2019.09.23 |