Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

꺄르륵

[Oracle SQL Developer] 기초 XXIII - PL/SQL 변수 본문

프로그래밍/DB

[Oracle SQL Developer] 기초 XXIII - PL/SQL 변수

Teddy. 2019. 10. 29. 19:59

PL/SQL 변수


1. 변수의 종류
  1.1. SCALAR 변수
    - 일반변수로 하나의 자료만 저장한다.
      
  1.2. 참조형 변수(REFERENCE)
    - 해당 테이블의 행(ROW)나 컬럼의 데이터 타입과 크기를 참조한다.
      
  1.3. COMPOSITE 변수
    - 배열변수
    - RECORD TYPE 과 TABLE TYPE

  1.4. BINDING 변수
    - 매개변수로 사용되는 IN, OUT 형 변수
    - 반환되는 데이터 저장을 위한 변수
      

2. 일반 변수
  2.1. 설명
    - 고급언어의 지역변수와 동일한 기능  
  
  2.2. 사용형식
    변수명 데이터타입|테이블명.컬럼명|%[ROW]TYPE [(크기)][:= 초기값]
    
    (1) 데이터타입 
      . 표준 SQL의 데이터 타입 사용
      . BINARY_INTEGER : -2147483648 ~ 2147483647 (4byte 정수형) = 2^31 ~ 2^31-1
        PLS_INTEGER : BINARY_INTEGER 와 동일, 저장공간과 처리 속도가 더 효율적이다.
      . BOOLEAN : TRUE, FALSE, NULL 
      . 테이블명.컬럼명%TYPE : 해당 컬럼괃 동일한 타입 및 크기로 설정한다.
      . 테이블명%ROWTYPE : 해당테이블 행과 같은(모든 컬럼)과 동일하게 지정한다.
      
    EX) 사원테이블에서 임의의 부서를 선택하여 사원정보를 조회하되 처음 조회된 사원의 급여가 
        1-3000 사이이면 '낮음', 3001-6000 사이이면 '보통', 6001-10000 사이면 '높음' 그 이상이면 '최상위'를 비고에 출력하시오.
        * 사원번호, 사원명, 급여, 비고
    
    DECLARE
      V_ID EMP.EMPLOYEE_ID%TYPE;
      V_NAME EMP.EMP_NAME%TYPE;
      V_SALARY EMP.SALARY%TYPE;
      V_MESSAGE VARCHAR2(20);
      V_DEPT_ID DEPT.DEPARTMENT_ID%TYPE;
    BEGIN
      V_DEPT_ID := TRUNC(SYS.DBMS_RANDOM.VALUE(10,120),-1); --(ROUND(SYS.DBMS_RANDOM.VALUE(10,120)/10))*10
      
      SELECT EMPLOYEE_ID, EMP_NAME, SALARY 
        INTO V_ID, V_NAME, V_SALARY
        FROM EMP
       WHERE DEPARTMENT_ID = V_DEPT_ID
         AND ROWNUM = 1;
      
      
      IF V_SALARY <= 3000 THEN
         V_MESSAGE := '낮음';
      ELSIF V_SALARY <= 6000 THEN
         V_MESSAGE := '보통';
      ELSIF V_SALARY <= 10000 THEN
         V_MESSAGE := '높음'; 
      ELSE V_MESSAGE := '최상위';
   END IF;
   
   DBMS_OUTPUT.PUT_LINE('사원번호 : ' || V_ID);
   DBMS_OUTPUT.PUT_LINE('부서번호 : ' || V_DEPT_ID);
   DBMS_OUTPUT.PUT_LINE('사원명 : ' || V_NAME);
   DBMS_OUTPUT.PUT_LINE('급여 : ' || V_SALARY);
   DBMS_OUTPUT.PUT_LINE('비고 : ' || V_MESSAGE);
   
   END;
   


    
2. IF 문
  2.1. 설명
    - 고급언어의 IF 문과 동일한 기능을 제공한다.
   
  2.2. 사용형식
    IF 조건 THEN 
       처리문;
    [ELSIF 조건 THEN
       처리문;
         :
    ELSE 
       처리문;]
    END IF;   
    
  EX) 키보드로 수 하나를 입력 받아 짝수이면 'EVEN NUMBER', 
      짝수이면 'ODD NUMBER' 를 출력하도록 하여라
      
  
  ACCEPT P_NUM PROMPT '숫자를 입력해주세요. : '
  DECLARE 
    V_NUMBER NUMBER;
    V_RESULT VARCHAR2(50);
  BEGIN
    V_NUMBER := TO_NUMBER('&P_NUM');  
  
    IF MOD(V_NUMBER,2) = 0 THEN
       V_RESULT := 'EVEN NUMBER';
    ELSE  V_RESULT := 'ODD NUMBER';
    END IF;
    
    DBMS_OUTPUT.PUT_LINE(V_NUMBER||'의 홀/짝 결과 : ' || V_RESULT);
  END;  

  EX) 4자리 년도를 입력 받아 윤년인지 평년인지 구분하는 블록 작성
      (윤년 연도가 4의 배수이면서 100의 배수가 아니거나 또는 400의 배수)
      
  ACCEPT P_YEAR PROMPT '년도를 입력해주세요. : '
  DECLARE
    V_YEAR NUMBER;
    V_RESULT VARCHAR(50);
    
  BEGIN
   V_YEAR := TO_NUMBER('&P_YEAR');
   
   IF(MOD(V_YEAR,4) = 0 AND MOD(V_YEAR,100) <> 0) OR (MOD(V_YEAR,400) = 0) THEN
     V_RESULT := '윤년';
   ELSE V_RESULT := '평년';  
   END IF;
  DBMS_OUTPUT.PUT_LINE('입력하신 ' || V_YEAR || '년은 ' || V_RESULT || '입니다');
  
  END;