Oracle PL/SQL 1 - 정의, 특징, 구조, 종류, 작성

정미·2023년 1월 25일
0

정의

Procedural Language extension to SQL
SQL을 확장한 절차적 언어

  • Oracle DBMS에서 SQL 언어를 확장하기 위해 사용하는 컴퓨터 프로그래밍 언어
  • SQL은 절차형 언어가 아니다.

특징

특징

  • 프로그래밍 언어와 데이터 처리 통합
    - 프로그래밍 언어처럼 구성하지만 SELECT, DELETE, UPDATE, INSERT, MERGE 와 같은 일반 SQL문을 별다른 작업 없이 사용 가능하다.
  • 블록 단위 구성
    - 선언부, 실행부, 예외처리부로 나뉜다.
    - DECLARE - BEGIN - EXCEPTION - END
    - 변수 선언은 DECLARE절에서만 가능하고, BEGIN절에서 새 값이 할당될 수 있다.
    - 마지막 라인에 /을 입력하면 해당 블록이 실행된다.
    - 큰 블록 안에 작은 블록을 위치시킬 수 있다.
  • 순차 처리 지원
    - IF, LOOP, FOR WHILE 등과 같은 제어문, 반복문 사용 가능
  • 예외 처리 지원
    - 예외 처리기가 동작한다.
  • 서브 프로그램 지원
    - FUNCTION, PROCEDURE 지원
  • 패키지를 사용한 모듈화 지원
    - 패키지: 연관성을 가지는 타입, 상수, 커서, 예외처리, 서브 프로그램들을 엮어서 하나의 응용 단위로 구성하는 것
  • 트리거
    - 데이터베이스에서 발생하는 이벤트를 처리하는 기능
    - 이벤트 발생 시 자동으로 트리거가 실행돼서 작성된 PL/SQL 로직을 호출한다.
  • 객체 지향 프로그래밍 지원
    - JAVA, C++, C# 같이 객체 타입 제공
  • 다양한 내장 API
    - 패키지, 함수, 프로시저 등으로 제공된다.
  • 플랫폼 독립적
    - 운영체제에 독립적이다.
    - 같은 오라클 버전에서 수행 가능하다.
  • 사용 가능한 SQL: Query, DML, TCL
    - DDL(CREATE, DROP, ALTER, TRUNCATE, ..), DCL(GRANT, REVOKE)는 동적 SQL을 이용할 때만 사용 가능하다.
    - SELECT문은 반드시 1개의 행이 검색되어야 한다.
  • PL/SQL은 컴파일 엔진을 포함하고 있다.

장점

  • SQL 단점 극복
    - 절차적 프로그래밍 기능
    - SQL과 procedure 생성자를 완벽하게 통합한다.
    - 변수 있음
    - 한 번에 여러 개의 명령문 사용 가능
    - 트래픽 감소
    - 제어문(If, Loop) 사용 가능
    - 예외 처리 가능
  • 비즈니스 로직 처리 절차를 쉽게 이해할 수 있다.
  • 성능 향상
    - 잘 만들어준 PL/SQL 명령문이라는 가정 하
    - 복잡한 업무를 처리하고 유지보수하는 경우
  • 모듈식 프로그램 개발 가능
    - 논리적인 작업을 구성하는 여러 명령어들을 하나의 블록으로 만들 수 있다.
  • 이식성이 좋다.

단점

  • SQL처럼 optimizer의 데이터 처리 절차 최적화를 받지 못한다.
    - 처리 속도가 늦어질 수 있다.

구조

DECLARE (선언부)

  • 선택
  • 모든 변수, 상수, 커서, 예외를 선언하는 부분

BEGIN (실행부)

  • 필수
  • Query와 제어문, 반복문, 함수 정의, 커서 속성 등 절차적 언어의 요소로 로직을 기술하는 부분

EXCEPTION (예외 처리부)

  • 선택
  • PL/SQL문이 실행되는 도중 발생하는 에러 = 예외 사항
    - 미리 정의된 예외
    - 사용자 정의 예외
    - Exception 함수 (sqlcode, sqlerrm)
  • 미리 정의된 예외를 추적하고 조건이 발생할 경우 취할 작업 문장을 정의하는 부분

END (실행문 종료)

  • 필수

종류

익명 블록

  • 이름 없는 PL/SQL Block
  • DB에 저장되지 않고 사용자가 필요할 때마다 반복적으로 작성, 실행한다.

Stored Procedure

  • return 값을 하나 이상 가질 수 있는 프로그램
  • 생성 이후 DB에 저장된다.
  • 실행하려는 로직을 처리하고 블록의 흐름을 제어한다.

Stored Function

  • return 값을 반드시 반환해야 하는 프로그램

Package

  • 하나 이상의 프로시저, 함수, 변수, 예외 등의 묶음

Trigger

  • 지정된 이벤트가 발생하면 자동으로 호출, 실행되는 특수한 형태의 프로시저
    - 테이블 생성 시에 이벤트를 지정한다.
  • DB 감시, 보안, 연속적인 오퍼레이션의 자동처리를 구현한다.

작성 방법

식별자 (identifier)

  • 상수, 변수, 예외, 커서, 서브 프로그램, 패키지를 포함하는 PL/SQL 프로그램 항목과 요소를 명명하기 위해 사용
  • 알파벳으로 시작해야 한다.
  • 30문자까지 가능
  • block에서 사용된 테이블의 컬럼명과 동일하면 안 된다.
  • 큰따옴표(" ")으로 둘러싸지 않으면 예약어를 식별자에 포함시킬 수 없다.

리터럴 (Literal)

  • 식별자로 표현되지 않은 명시적인 숫자, 문자, 문자열, 부울값
  • 문자와 날짜 리터럴은 반드시 단일 인용 부호(' ')로 둘러 쌓여 있어야 한다.
    - V_NAME = := 'JM';
  • 숫자 리터럴은 단순값 혹은 과학적인 표기법에 의해 표현될 수 있다.
    - V_DEGREE := 33.5; V_VALUE := 2e5; V_VALUE := 2*10;

주석

  • 단일 행 --
  • 여러 행 /* */

SQL 함수 사용

  • 사용 가능 함수: 단일 행 숫자, 단일 행 문자, 날짜, 데이터형 변환(to_date, to_char, to_number)
  • 사용 불가 함수: DECODE, GREATEST, LEAST, GROUP functions(AVG, MIN, SUM, ..)

Query

  • 행에 /가 있으면 쿼리 종결
    - 쿼리를 수행하기 위해 /가 반드시 입력되어야 한다.
  • 한 문장이 끝날 때마다 세미콜론 ;을 사용하여 문장이 끝났음을 명시한다.
    - END; 는 한 블록이 끝났음을 명시

중첩 블록과 참조

  • 실행 명령이 허용되는 곳 어디서든지 중첩될 수 있다.
  • 중첩 문장은 하나의 문장이 된다.
  • 예외처리부도 중첩 블록을 포함할 수 있다.
  • 객체 범위: 객체를 참조할 수 있는 프로그램 영역
    - 내부 블록은 부모(둘러싸는) 블록을 참조할 수 있다.
    - 외부 블록은 자식(둘러싸고 있는) 블록을 참조할 수 없다.
    - 형제 블록을 참조할 수 없다.

참조

0개의 댓글