개발 수업/DB

[PL/SQL] PL/SQL구성요소(상수),PL/SQL 제어문

오늘 하루s 2023. 6. 16. 18:20
728x90
더보기

Day34. 230616

PL/SQL구성요소

상수

한 번 값을 할당하면 변하지 않음.

상수명 CONSTANT 데이터타입 := 초기값;

ex) v_num CONSTANT NUMBER:=10;

 

 

 

PL/SQL 제어문

IF문

IF 조건1 THEN
    --조건1만족 실행코드
 [ELSIF 조건2 THEN]
    --조건2만족 실행코드
 [ELSIF 조건N THEN]
   --조건N만족 실행코드
 [ELSE]
   조건X 실행코드
END IF;

예1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DECLARE
    v_num1 NUMBER:=10;
    v_num2 NUMBER:=20;
BEGIN
    IF v_num1 > v_num2 THEN
        DBMS_OUTPUT.PUT_LINE('조건1만족');
    ELSIF v_num1 < v_num2 THEN
        DBMS_OUTPUT.PUT_LINE('조건2만족');
    ELSIF v_num1 = v_num2 THEN
        DBMS_OUTPUT.PUT_LINE('조건3만족');
    ELSE
        DBMS_OUTPUT.PUT_LINE('조건불일치');
    END IF;
END;
/
cs

실행 결과

예2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
DECLARE
    v_num1 NUMBER:=10;
    v_num2 NUMBER:=20;
BEGIN
    v_num1:=dbms_random.value(10,120); --난수
    v_num2:=dbms_random.value(10,120);
    DBMS_OUTPUT.PUT_LINE('v_num1='||v_num1);
    DBMS_OUTPUT.PUT_LINE('v_num2='||v_num2);
    
    v_num1:=ROUND(v_num1,-1); --ROUND(v_num1,0):소수점 첫번째 자리에서 반올림.
    v_num2:=ROUND(v_num2,-1);
    DBMS_OUTPUT.PUT_LINE('ROUND적용 후 v_num1='||v_num1);
    DBMS_OUTPUT.PUT_LINE('ROUND적용 후 v_num2='||v_num2);
    
    IF v_num1 > v_num2 THEN
        DBMS_OUTPUT.PUT_LINE('조건1만족');
    ELSIF v_num1 < v_num2 THEN
        DBMS_OUTPUT.PUT_LINE('조건2만족');
    ELSIF v_num1 = v_num2 THEN
        DBMS_OUTPUT.PUT_LINE('조건3만족');
    ELSE
        DBMS_OUTPUT.PUT_LINE('조건불일치');
    END IF;
END;
/
cs

실행 결과

 

- dbms_random.value(값1,값2) : 값1~값2 범위에 있는 난수발생

 

예3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
DECLARE
    v_ename varchar2(30):=null;
    v_sal NUMBER:=0;
    v_deptno NUMBER:=0;
BEGIN
    v_deptno:=round(dbms_random.value(10,30),-1);
    select ename,sal,deptno
    INTO v_ename,v_sal,v_deptno
    from emp
    where deptno=v_deptno and rownum=1;
    DBMS_OUTPUT.PUT_LINE(v_ename);
    DBMS_OUTPUT.PUT_LINE(v_sal);
    DBMS_OUTPUT.PUT_LINE(v_deptno);
    
    IF v_sal between 1 and 1000 THEN
        DBMS_OUTPUT.PUT_LINE('낮음');
    ELSIF v_sal between 1001 and 2000 THEN
        DBMS_OUTPUT.PUT_LINE('중간');
    ELSIF v_sal between 2001 and 3000 THEN
        DBMS_OUTPUT.PUT_LINE('높음');
    ELSE
        DBMS_OUTPUT.PUT_LINE('최상위');
    END IF;
END;
/
cs

 

 

LOOP문

LOOP
  --반복실행문
  EXIT [WHEN 조건];
END LOOP;

예) 반복실행문 3*1=3 ... 3*9=27

 

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
   v_num1 number:=3;
   v_num2 number:=1;
BEGIN
 LOOP
   --반복실행문 3*1=3 3*9=27
   DBMS_OUTPUT.PUT_LINE(v_num1||'*'||v_num2||'='||v_num1*v_num2);
   v_num2:=v_num2+1;
  EXIT WHEN v_num2>9;
 END LOOP;
END;
/
cs

실행 결과

 

 

WHILE문

WHILE 조건
LOOP
  --반복실행문
END LOOP;

예) 5*1=5... 5*9=45

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
   v_num1 number:=5;
   v_num2 number:=1;
BEGIN
   WHILE v_num2<=9
   --반복실행문 5*1=5 5*9=45
   LOOP
   DBMS_OUTPUT.PUT_LINE(v_num1||'*'||v_num2||'='||v_num1*v_num2);
   v_num2:=v_num2+1;
 END LOOP;
END;
/
cs

실행 결과

 

 

FOR문

FOR 인덱스 IN [REVERSE] 초기값..최종값
LOOP
 --반복실행문
END LOOP;

예) 19*1=5... 19*9=171

1
2
3
4
5
6
7
8
9
10
DECLARE
   v_num1 number:=19;
BEGIN
   FOR v_num2 IN  REVERSE 1..9
   --반복실행문 19*1=5 19*9=171
   LOOP
   DBMS_OUTPUT.PUT_LINE(v_num1||'*'||v_num2||'='||v_num1*v_num2);
 END LOOP;
END;
/
cs

 

실행 결과

REVERSE- > 숫자 거꾸로 출력

 

728x90