DB모델링

내가 보려고 정리한 오라클 SQL_PL/SQL

비비펄 2022. 11. 30. 17:40

📌PL/SQL
  - PROCEDURAL LANGUAGE SQL (절차적 언어)
  - 표준 SQL은 분기문, 변수, 제어문 등이 없어 기능이 제한적
    이를 해결하기 위한 방법으로 제공된 것이 PL/SQL
  - 미리 컴파일되어 서버에 저장되어 실행속도 향상과 네트워크 트래픽 감소
  - 캡슐화,모듈화 가능 --캡슐화:부당하게 영향을 미치거나 간섭을 받지 않도록 함/모듈화:하나의 결과를 내보내기 위해서 명령들이 하나로 모일 수 있게 하는 것(단일업무)
  - 익명블록(Anonymous Block), 프로시져(Stored Procedure), 함수(User Defined Function)
    트리거(Trigger), 패키지(Pakage) 등이 제공됨

 

📌익명블록(Anonymous Block)
 - 이름이 없는 블록
 - 저장되지 않음
 -pl/sql의 기본 구조 제공

(사용형식)
 DECLARE
  선언영역 => 변수,상수,커서,사용자데이터타입
 BEGIN
  실행영역 => 비지니스 로직을 처리하기 위한 SQL문
  [EXCEPTION
    예외처리문 
  ]
 END;
❗사용예::
구구단의 7단을 출력하는 익명 블록을 작성하시오

 DECLARE
  L_BASE NUMBER:=7;
  L_RESULT NUMBER:=0;
 BEGIN
  FOR I IN 1..9 LOOP
   L_RESULT:=L_BASE*I;
   DBMS_OUTPUT.PUT_LINE(L_BASE||'*'||I||'='||L_RESULT);
  END LOOP;
 END;​

❗변수

  . 고급 프로그램 언어의 변수와 같은 기능

  . SCLAR 타입 : 보통의 변수 타입, 하나의 자료만 보관

  . 참조형(REFERENCE) : 행참조, 열참조
  . SCLAR, 참조형(REFERENCE), BIND형, COMPOSITE 변수가 제공

(변수[상수] 선언형식)
 변수[상수명] [CONSTANT] 데이터타입[:=초기값];

  . 상수 선언은 'CONSTANT'을 사용하고 이때 반드시 초기값을 기술해야 함
  . 데이터 타입은 SQL에서 사용하는 표준 데이터 타입과 PLS_INTEGER, BINARY_INTEGER, BOOLEAN 등이 사용됨
  .  할당연산자(대입연산자)':='임 / ※ '='는 동등연산자
  . 변수에 초기값이 할당되지 않으면 모든 변수는 NULL값으로 초기화 됨

  . '데이터 타입'대신 참조형이 사용될 수 있음

  ❗ 참조형 변수

    - 행참조와 열참조가 제공
    - 열참조: 테이블명.컬럼명%TYPE
      ex) L_NAME MEMBER.MEM_NAME%TYPE
      
    - 행참조: 테이블명%ROWTYPE
      ex) L_MEMROW MEMBER%ROWTYPE;
          회원명컬럼은 L_MEMROW.MEM_NAME으로 참조

사용예::
10-110 사이의 임의의 수를 발생시켜 해당부서에 입사일이 가장 빠른 사원의 사원번호, 사원명,부서번호,입사일,급여를 출력하는 익명 블록을 작성하시오.

    DECLARE --변수선언
      L_EID EMP.EMPLOYEE_ID%TYPE;
      L_ENAME EMP.EMP_NAME%TYPE;
      L_DID HR.DEPARTMENTS.DEPARTMENT_ID%TYPE;
      L_DATE DATE;
      L_SAL NUMBER:=0;
    BEGIN
      L_DID:=TRUNC(DBMS_RANDOM.VALUE(10,119),-1); 
        --랜덤발생 DBMS_RANDOM.VALUE(최솟값,최댓값)
      
      SELECT A.EMPLOYEE_ID,A.EMP_NAME,A.HIRE_DATE,A.SALARY
        INTO L_EID,L_ENAME,L_DATE,L_SAL 
        FROM (SELECT EMPLOYEE_ID,EMP_NAME,HIRE_DATE,SALARY
                FROM EMP
               WHERE DEPARTMENT_ID = L_DID
               ORDER BY 3)A --서브쿼리에는 INTO를 쓸수X
       WHERE ROWNUM = 1;
       
       DBMS_OUTPUT.PUT_LINE('사원번호 : '||L_EID);
       DBMS_OUTPUT.PUT_LINE('사원명 : '||L_ENAME);
       DBMS_OUTPUT.PUT_LINE('부서번호 : '||L_DID);
       DBMS_OUTPUT.PUT_LINE('입사일 : '||L_DATE);
       DBMS_OUTPUT.PUT_LINE('급여 : '||L_SAL);
       DBMS_OUTPUT.PUT_LINE('----------------------');
    END;​