PLㅣ/SQL


  - PROCEDURAL LANGUAGE SQL
  - 표준 SQL에 분기문, 변수, 제어문 등이 없어 기능이 제한적
    이를 해결하기 위한 방법으로 제공된 것이 PL/SQL
  - 미리 컴파일되어 서버에 저장되어 실행속도 향상과 네트워크 트래픽 감소
  - 캡슐화, 모듈화 가능
  - 익명블록(Anonymous Block), 프로시져(Stored Procedure), 함수(User Defined Function)
    트리거(Trigger), 패키지(Package) 등이 제공됨


1. 익명등록
 - 이름이 없는 블록
 - 저장되지 않음
 - 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;

 1)변수
  . 고급 프로그램 언어의 변수와 같은 기능 제공
  . SCLAR 타입 : 보통의 변수 타입, 하나의 자료만 보관
  . 참조형(REFERENCE) : 행참조,열참조
  . BIND형, COMPOSITE 변수가 제공
  
  (변수[상수] 선언형식)

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


    . 상수 선언은 'CONSTANT'을 사용하고 이때 반드시 초기값을 기술해야 함 
    . 데이터 타입은 SQL에서 사용하는 표준 데이터 타입과 PLS_INTEGER, BINARY_INTEGER, BOOLEAN
      등이 사용됨 --BOOLEAN 값 3가지 (TRUE,FALSE,NULL)
    . 할당연산자는 ':='임 -- '='은 동등연산자
    . 변수에 초기값이 할당되지 않으면 모든 변수에는 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);
   
   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절을 사용하지 않음
    WHERE ROWNUM = 1;  
    
    DBMS_OUTPUT.PUT_LINE('사원번호 : '||L_EID); --자바 SYSTEM.OUT.PRINTLN 이랑 같음
    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;

'ORACLE 복습 & 정리' 카테고리의 다른 글

[ORACLE] 분기명령 221201-02  (0) 2022.12.01
[ORACLE] 커서(CURSOR) 2221201-01  (0) 2022.12.01
[ORACLE] INDEX 221130-03  (0) 2022.11.30
[ORACLE] SEQUENCE,동의어 221130-02  (0) 2022.11.30
[ORACLE] 계층형 쿼리 221129-03  (0) 2022.11.30

+ Recent posts