햄찌개

ORACLE 공부 11일차 2020/08/31 본문

Oracle

ORACLE 공부 11일차 2020/08/31

햄찌개 2020. 8. 31. 15:09

2020-08-31-01)
1. IF문 
    - 다른 응용 프로그램언어의 IF문과 같은 기능
    (사용형식) 
    IF 조건 THEN 
        명령1;
    [ELSE 
        명령 2;]
    END IF; 

 

(나열식 IF)
    IF 조건1 THEN
        명령1;
    ELSE 조건2 THEN
        명령2;
    ELSIF 조건3 THEN
        명령3;
    ELSE
        명령4;
    END IF;

 

(중첩 IF)    
    IF 조건1 THEN
        IF 조건2 THEN
            명령1;
         ELSE 
            명령2;
        END IF;
   ELSE 
        명령3;
   END IF;     

 

 예) 임의의 부서코드(10~110)를 하난 생성하여 해당부서에 속한 사원 정보를 조회하고 
      첫번째 검색된 사원의 급여가 
      3000미만이면 '낮은임금',
      3000~6000 이면 '중간임금'
      그 이상이면 '높은임금'을 출력하시오.
      출력할 데이터는 사원명, 부서명, 급여, 비고이다.


DECLARE --변수 선언부
    V_NAME EMPLOYEES.EMP_NAME%TYPE;
    V_DEPT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE;
    V_SAL EMPLOYEES.SALARY%TYPE;
    V_REMAK VARCHAR2(50);
    V_DEPT_ID DEPARTMENTS.DEPARTMENT_ID%TYPE;
BEGIN     
  V_DEPT_ID := ROUND(DBMS_RANDOM.VALUE(10,110),-1); --10부터 100사이에 있는 정수형 난수 발생 ,-1해서 일의자리는 전부 0
SELECT  A.EMP_NAME, B.DEPARTMENT_NAME, A.SALARY INTO V_NAME, V_DEPT_NAME, V_SAL        --INTO : 변수에 넘겨주는 것
    FROM EMPLOYEES A, DEPARTMENTS B
 WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
    AND A.DEPARTMENT_ID = V_DEPT_ID
    AND ROWNUM =1;
    
 IF V_SAL BETWEEN 1 AND 2999 THEN 
    V_REMAK :='낮은임금';
 ELSIF V_SAL BETWEEN 3000 AND 6000 THEN
    V_REMAK :='보통임금';
 ELSE
    V_REMAK :='높은임금';
 END IF;   
  
 DBMS_OUTPUT.PUT_LINE(V_NAME||', '||V_DEPT_NAME ||', '||V_SAL|| '=>'||V_REMAK);  
 
 END;

 


2020-08-31-02)
반복문
    - PL/SQL의 반복문에는 LOOP, WHILE, FOR문이 제동
    

 

1)LOOP문 
        - 반복문의 기본구조
        (사용형식)
        LOOP
            반복처리문;
            EXIT WHEN 조건; --조건이 맞으면 빠져나간다 JAVA의 break와 비슷
        END LOOP;   
        - '조건'이 참(TRUE)이면 반복을 벗어난다. 


예) 단을 입력받아 해당 구구단 출력 ( LOOP문 이용)

ACCEPT P_BASE PROMPT '단 (2~9) 입력 : '
DECLARE 
    V_BASE NUMBER := TO_NUMBER('&P_BASE');
    V_CNT NUMBER := 1;
BEGIN 
    LOOP
        DBMS_OUTPUT.PUT_LINE(V_BASE || ' * '||V_CNT||' = '||V_BASE*V_CNT);
    EXIT WHEN V_CNT =9;
    V_CNT := V_CNT+1;
    END LOOP;
 END;   

예) 회원테이블에서 마일리지가 4000이상인 회원의 이름, 직업, 마일리지를 구하는 커서를
    생성하고 커서결과를 처리할 때 성별을 구별하여 '여성회원', '남성회원'을 출력하시오 

DECLARE 
  V_NAME MEMBER.MEM_NAME%TYPE;
  V_JOB MEMBER.MEM_JOB%TYPE;
  V_MILE MEMBER.MEM_MILEAGE%TYPE;
  V_GENDER VARCHAR2(30);
  V_ID CHAR(1);
  CURSOR CUR_MEM2 IS
     SELECT MEM_NAME, MEM_JOB, MEM_MILEAGE
       FROM MEMBER
      WHERE MEM_MILEAGE >= 3000;
BEGIN 
  OPEN CUR_MEM2;
  LOOP
    FETCH CUR_MEM2 INTO V_NAME, V_JOB, V_MILE;
    EXIT WHEN CUR_MEM2%NOTFOUND;
      SELECT SUBSTR(MEM_REGNO2,1,1) INTO V_ID
        FROM MEMBER 
       WHERE MEM_NAME = V_NAME;
    IF V_ID = '1' OR V_ID = '3' THEN 
      V_GENDER := '남성회원';
    ELSE 
      V_GENDER := '여성회원';
    END IF;
      DBMS_OUTPUT.PUT_LINE('회원명 : '||V_NAME);
      DBMS_OUTPUT.PUT_LINE('성별 : '||V_GENDER);
      DBMS_OUTPUT.PUT_LINE('직업 : '||V_JOB);
      DBMS_OUTPUT.PUT_LINE('마일리지 : '||V_MILE);
      DBMS_OUTPUT.PUT_LINE('----------------------------');
    END LOOP;
      DBMS_OUTPUT.PUT_LINE('회원수 : '||CUR_MEM2%ROWCOUNT);
      CLOSE CUR_MEM2;
END;

 

2) WHILE 문 
    - 다른 애플리케이션 개발언어의 WHILE문과 같은 기능 제공
    (사용형식)
    WHILE 조건
        LOOP
            반복처리문;
    END LOOP;
    - 조건이 참(true)이면 반복 수행하고 거짓(false)이면 반복문을 벗어난다.



   예) 구구단 7단 출력    

DECLARE 
    V_CNT NUMBER :=0;
    V_RESULT VARCHAR2(50);
BEGIN
    WHILE V_CNT < 9 LOOP
    V_CNT:=V_CNT+1;
    V_RESULT :='7 * ' ||V_CNT||'='|| V_CNT*7;
    DBMS_OUTPUT.PUT_LINE(V_RESULT);
  END LOOP;  
   END;     
        

3-1. 일반 FOR문 
    -다른 애플리케이션 개발언어의 FOR문의 역할 
    (사용형식)
    FOR 인덱스 IN (REVERSE) 초기값..최종값 
        LOOP 
            반복처리문;
    END LOOP;       
    - 인덱스는 선언하지 않아도 된다.


예) 구구단 7단을 출력

DECLARE 
    V_BASE NUMBER :=7;
    V_RESULT VARCHAR2(30);
  BEGIN 
    FOR I IN 1..9 LOOP
    V_RESULT := V_BASE||' * '||I||' = '||V_BASE*I;
    DBMS_OUTPUT.PUT_LINE(V_RESULT);
    END LOOP;
    END;       

 


   3-2. CURSOR를 사용한 FOR 문 
   (사용형식) 
   FOR 레코드명 IN 커서명 LOOP 
        커서 처리문;
    END LOOP;
  - 커서의 OPEN, FETCH, CLOSE문을 생략  

  - 커서의 컬럼명은 '레코드명.컬럼명'으로 참조 
  - 레코드명은 시스템에서 제공 (선언이 불필요)
        

 

 

 

 

 

'Oracle' 카테고리의 다른 글

ORACLE 공부 13일차 2020/09/02-(1)  (0) 2020.09.02
ORACLE 공부 12일차 2020/09/01  (1) 2020.09.01
ORACLE 공부 10일차 2020/08/27~28  (0) 2020.08.28
ORACLE 공부 9일차 2020/08/24  (0) 2020.08.28
ORACLE 공부 8일차 2020/08/17~18  (0) 2020.08.28