[ SQL ] Oracle PL/SQL #2 _ 제어문 & 반복문
PL/SQL 제어문
1. 선택문
- if 문은 조건을 제시해서 만족하느냐 하지 않느냐에 따라 문을 선택적으로 수행하기 때문에 선택문이라고 한다.
- 단일 if…then 문은 조건에 따라 어떤 명령을 선택적으로 처리하기 위해 사용하는 가장 대표적인 문이다.
- if…then 문의 조건이 true 이면 then 문 이하의 문을 실행하고 조건이 false 이거나 null 이면 end if 문으로 수행을 종료한다
(1) 단일 if … then 문
if 조건문 then
조건에 만족할 경우 실행되는 문;
end if;
ex 1 ) emp 테이블에서 직원의 커미션을 구한다.
#1 화면 출력기능 활성화
SET SERVEROUTPUT ON; |
#2 레퍼런스 변수 선언 & 실행문
-- 레퍼런스 변수 선언 DECLARE SONEMP EMP%ROWTYPE; SONSAL NUMBER(7,2); BEGIN SELECT * INTO SONEMP FROM EMP WHERE ENAME = 'SMITH'; -- 커미션이 NULL일 경우를 조건에 지정하고 수행 IF(SONEMP.COMM IS NULL) THEN SONSAL := SONEMP.SAL*12; -- 조건이 FALSE이거나 NULL 일 경우를 수행종료 END IF; DBMS_OUTPUT.PUT_LINE('사번 이름 커미션'); DBMS_OUTPUT.PUT_LINE('----------------'); DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||' '||SONEMP.ENAME||' '||SONSAL); END; |
사번 이름 커미션 ---------------- 7369 SMITH 9600 PL/SQL 프로시저가 성공적으로 완료되었습니다. |
ex 2 ) emp 테이블에서 부서번호로 부서명을 확인한다.
#1 화면 출력기능 활성화
SET SERVEROUTPUT ON; |
#2 레퍼런스 변수와 스칼라 변수 선언 & 실행문
-- 레퍼런스 변수와 스칼라 변수 선언 DECLARE SONNO EMP.EMPNO % TYPE; SONNAME EMP.ENAME % TYPE; SONDEPTNO EMP.DEPTNO % TYPE; -- sondname 변수를 null 로 초기화한다 SONDNAME VARCHAR2(20) := NULL; BEGIN SELECT EMPNO, ENAME, DEPTNO INTO SONNO, SONNAME, SONDEPTNO FROM EMP WHERE EMPNO = 7369; -- SONDEPTNO 변수가 10 일 경우를 조건에 지정하고 수행한다. IF(SONDEPTNO = 10) THEN SONDNAME := 'ACCOUNTING'; END IF; -- SONDEPTNO 변수가 20 일 경우를 조건에 지정하고 수행한다. IF(SONDEPTNO = 20) THEN SONDNAME := 'CLERK'; END IF; -- SONDEPTNO 변수가 30 일 경우를 조건에 지정하고 수행한다. IF(SONDEPTNO = 30) THEN sondname := 'sales'; end if; -- SONDEPTNO 변수가 40 일 경우를 조건에 지정하고 수행한다. if(sondeptno = 40) then sondname := 'operations'; -- 조건이 false 이거나 null 이면 수행을 종료한다. end if; dbms_output.put_line(' 사번 이름 부서명'); dbms_output.put_line('--------------------------'); dbms_output.put_line(''||SONNO||' '||SONNAME||' '||SONDNAME); END; |
사번 이름 부서명 -------------------------- 7369 SMITH CLERK PL/SQL 프로시저가 성공적으로 완료되었습니다. |
(2) 이중 if…then…else 문
- if…then 문 중에 가장 일반적으로 많이 사용되는 형식이 이중 if…then…else 문이다.
- 이중 if…then…else 문은 참일 때와 거짓일 때 각각 다른 문을 수행하도록 지정할 수 있다.
- 이중 if…then…else 문은 조건을 검사하고 그 결과가 참이면 조건에 만족하는 문을 수행하고 거짓이면 조건에 만족하지 않는 문을 수행한다.
if 조건문 then
조건에 만족할 경우 실행되는 문;
else
조건에 만족하지 않을 때 실행되는 문;
end if
ex ) emp 테이블에서 사원명으로 연봉을 조회한다.
#1 화면 출력기능 활성화
SET SERVEROUTPUT ON; |
#2 레퍼런스 변수와 스칼라 변수 선언 & 실행문
-- 레퍼런스 변수와 스칼라 변수 선언 BEGIN SELECT * INTO SONEMP FROM EMP WHERE ENAME = 'SMITH'; -- 커미션이 NULL일 경우를 조건에 지정하고 수행한다. IF(SONEMP.COMM IS NULL) THEN SONSAL := SONEMP.SAL*12; -- 커미션이 NULL이 아닐 때 수행 ELSE SONSAL := SONEMP.SAL*12 + SONEMP.COMM; -- 조건이 FALSE 이거나 NULL이면 수행을 종료 END IF; DBMS_OUTPUT.PUT_LINE('사번 이름 연봉'); DBMS_OUTPUT.PUT_LINE('-----------------'); DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||' '||SONEMP.ENAME||' '||SONSAL); END; |
사번 이름 연봉 ----------------- 7369 SMITH 9600 PL/SQL 프로시저가 성공적으로 완료되었습니다. |
(3) 다중 if…then…elsif…else 문
- 다중 if…then…elsif…else 문은 경우의 수가 둘이 아닌 셋 이상에서 하나를 선택해야 할 때 사용한다.
if 조건문 then
조건에 만족할 경우 실행되는 문 1;
elsif 조건문 then
조건에 만족할 경우 실행되는 문 2;
᎒
elsif 조건문 then
조건에 만족할 경우 실행되는 문 N;
else
조건에 만족하지 않을 때 실행되는 문;
end if;
ex ) emp 테이블에서 부서번호로 부서명을 확인한다.
#1 화면 출력기능 활성화
SET SERVEROUTPUT ON; |
#2 레퍼런스 변수와 스칼라 변수 선언 & 실행문
-- 레퍼런스 변수와 스칼라 변수를 선언한다. DECLARE SONEMP EMP%ROWTYPE; SONDNAME VARCHAR2(14); BEGIN SELECT * INTO SONEMP FROM EMP WHERE ENAME = 'SMITH'; -- sondeptno 변수가 10 일 경우를 조건에 지정하고 수행한다. IF(SONEMP.DEPTNO = 10)THEN SONDNAME := 'ACCOURNTING'; -- sondeptno 변수가 20 일 경우를 조건에 지정하고 수행한다. ELSIF(SONEMP.DEPTNO = 20)THEN SONDNAME := 'CLERK'; -- sondeptno 변수가 30 일 경우를 조건에 지정하고 수행한다. ELSIF(SONEMP.DEPTNO = 30)THEN SONDNAME := 'SALES'; -- sondeptno 변수가 40 일 경우를 조건에 지정하고 수행한다. ELSIF(SONEMP.DEPTNO = 40)THEN SONDNAME := 'OPERATIONS'; -- 조건이 false 이거나 null 이면 수행을 종료한다. END IF; DBMS_OUTPUT.PUT_LINE('사번 이름 부서명'); DBMS_OUTPUT.PUT_LINE('-----------------'); DBMS_OUTPUT.PUT_LINE(''||SONEMP.EMPNO||' '||SONEMP.ENAME||' '||SONDNAME); END; |
사번 이름 부서명 ----------------- 7369 SMITH CLERK PL/SQL 프로시저가 성공적으로 완료되었습니다. |
2. 반복문
- 반복문은 특정 조건에 따라서 특정 실행문을 반복적으로 수행한다.
- 반복문은 반복 횟수를 지정하는 것도 가능하고 무한정 반복 처리하는 무한 루프도 가능하다.
- 선택문이 결과에 중점을 둔다면 반복문은 목적에 중점을 둔다.
(1) loop…end loop 문
- loop…end loop 문은 조건없이 반복 작업을 제공한다.
- loop…end loop 문은 실행의 흐름이 end loop 문에 도달할 때마다 loop 문으로 제어권을 전달하는 이러한 루프를 무한 루프라 하고 여기서 빠져나가려면 exit 문을 사용한다.
- loop 문은 루프에 들어갈 때 조건이 이미 일치했다 할지라도 적어도 한 번은 문이 실행된다.
- exit 문을 이용하여 end loop 문 다음으로 제어권을 전달하기 때문에 루프를 종료할 수 있다.
- 조건에 따라 루프를 종료할 수 있도록 when 문을 덧붙일 수 있으며 when 문 다음의 조건식이 참이면 루프를 끝내고 루프 후의 다음 문으로 제어권을 전달한다
loop
조건에 만족할 경우 실행되는 문 1;
조건에 만족할 경우 실행되는 문 2;
᎒
조건에 만족할 경우 실행되는 문 N;
exit [when 조건식];
end loop
ex ) loop…end loop 문으로 1 부터 5 까지 출력한다.
#1 화면 출력기능 활성화
SET SERVEROUTPUT ON; |
#2
DECLARE NUM NUMBER := 1; BEGIN -- END LOOP 문에서 제어권을 전달받고 반복 LOOP DBMS_OUTPUT.PUT_LINE(NUM); -- NUM 변수에 1을 더하여 NUM 변수에 할당하여 누적 NUM := NUM +1 ; IF(NUM > 5) THEN EXIT; END IF; -- 제어권을 LOOP문으로 전달 END LOOP; END; |
1 2 3 4 5 PL/SQL 프로시저가 성공적으로 완료되었습니다. |
(2) for…in…end loop 문
- for…in…end loop 문은 카운트를 기본으로 반복 작업을 제공한다.
- for…in…end loop 문은 실행의 흐름이 end loop 문에 도달할 때마다 for…in 문의 카운트로 제어권을 전달하여 루프 한다.
- for…in…end loop 문에서 사용되는 카운트는 정수로 자동 선언되므로 따로 선언할 필요가 없다.
- for…in…end loop 문은 루프를 반복할 때마다 자동으로 1 씩 증가 또는 감소한다.
for counter in [reverse] lower..upper loop
조건에 만족할 경우 실행되는 문 1;
조건에 만족할 경우 실행되는 문 2;
᎒
조건에 만족할 경우 실행되는 문 N;
end loop;
① counter
upper 나 lower 에 도달할 때까지 루프를 반복함으로써 1 씩 자동으로 증가하거나 감소하는 값을 가진 암시적으로 선언된 정수이다.
② reverse
upper 에서 lower 까지 반복함으로써 인덱스가 1 씩 감소하도록 한다.
③ lower..upper
lower..upper 는 lower 와 upper 사이를 ..(더블 도트)로 구분한다.
lower 는 counter 값의 범위에 대한 하단의 한계값을 지정한다.
upper 는 counter 값의 범위에 대한 상단의 한계값을 지정한다
ex ) for…end loop 문으로 1 부터 5 까지 출력한다
#1 화면 출력기능 활성화
SET SERVEROUTPUT ON; |
#2
DECLARE BEGIN -- END LOOP 문에서 제어권을 전달반고 NUM 변수는 1~5까지 반복 FOR NUM IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE(NUM); -- 제어권을 for..in문의 NUM 변수로 전달 END LOOP; END; |
1 2 3 4 5 PL/SQL 프로시저가 성공적으로 완료되었습니다. |
(3) while…loop…end loop 문
- while…loop…end loop 문은 조건을 기본으로 반복 작업을 제공한다.
- while…loop…end loop 문은 실행의 흐름이 end loop 문에 도달할 때마다 while…loop 문의 조건식으로 제어권을 전달하여 루프 한다.
- while…loop…end loop 문은 조건식이 참인 동안만 문을 반복한다.
- while…loop…end loop 문의 조건식은 반복이 시작될 때 확인하므로 조건이 거짓이면 루프를 빠져나가므로 루프 내의 문이 한 번도 수행되지 않을 경우도 있다.
while 조건식 loop
조건에 만족할 경우 실행되는 문 1;
조건에 만족할 경우 실행되는 문 2;
᎒
조건에 만족할 경우 실행되는 문 N;
end loop;
ex ) while…loop…end loop 문으로 1 부터 5 까지 출력한다.
#1 화면 출력기능 활성화
SET SERVEROUTPUT ON; |
#2
DECLARE NUM NUMBER := 1 ; BEGIN -- END LOOP 문에서 제어권을 전달받고 NUM QUSTNSMS 5이하까지 반복 WHILE( NUM <= 5 )LOOP DBMS_OUTPUT.PUT_LINE(NUM); -- NUM 변수에 1을 더하여 NUM 변수에 할당하여 누적 NUM := NUM + 1 ; -- 제어권을 while..loop 문의 (NUM <= 5) 조건식에 전달 END LOOP; END; |
1 2 3 4 5 PL/SQL 프로시저가 성공적으로 완료되었습니다. |