IT Log

PL/SQL 본문

SQL

PL/SQL

newly0513 2019. 4. 29. 13:37
728x90
반응형

PL/SQL이란?

  • 절차형 SQL로, Oracle DBMS에서 SQL언어를 확장하기 위해 사용하는 프로그래밍 언어.
  • SQL에도 절차 지향적인 프로그램이 가능하도록 DBMS마다 PL/SQL(oracle), SQL/PL(DB2), T-SQL(SQL server) 등의 절차형 SQL을 제공.

 

PL/SQL 특징

  • PL/SQL은 Block 구조로 되어있어 각 기능별로 모듈화 가능.
  • 변수, 상수 등을 선언하여 SQL 문장 간 값을 교환.
  • IF, LOOP 등의 절차형 언어를 사용하여 절차적인 프로그램이 가능.
  • DBMS 정의 에러나 사용자 정의 에러를 정의하여 사용.
  • PL/SQL은 응용 프로그램의 성능을 향상.
  • PL/SQL 은 Oracle에 내장되어 Oracle과 PL/SQL을 지원하는 어떤 서버로도 프로그램을 옮길 수 있음.
  • PL/SQL은 응용 프로그램의 성능을 향상.
  • PL/SQL은 여러 SQL문장을 Block으로 묶고 한 번에 Block 전부를 서버로 보내 통신량 감소.

 

PL/SQL 구조

  • DECLARE : BEGIN ~ END 절에서 사용될 변수와 인수에 대한 정의 및 데이터 타입을 선언하는 선언부.
  • BEGIN ~ END : 개발자가 처리하고자 하는 SQL문과 여러가지 비교문, 제어문을 이용하여 필요한 로직을 처리하는 실행부.
  • EXCEPTION : BEGIN ~ END 절에서 실행되는 SQL문이 실행될 때 에러가 발생하면 그 에러를 어떻게 처리할 것인지를 정의하는 예외 처리부.
  • EXCEPTION은 선택항목이고, 나머지는 필수 항목.

 

PL/SQL 기본문법

CREATE [OR REPLACE] Procedure [Procedure_name]
(argument1 [mode] data_type1,
 argument2 [mode] data_type2,
 ... ...)
 
 IS [AS]
 ... ...
 
 BEGIN
 ... ...
 
 EXCEPTION
 ... ...
 
 END;
 /
DROP Procedure [procedure_name];
  • OR REPLACE를 붙이면 데이터베이스 내에 같은 이름의 프로시저가 있을 경우, 기존의 프로시저를 무시하고 새로운 내용으로 덮어쓰기 함.
  • [mode]에는 3가지 유형이 있는데, 첫번째로 in은 값을 프로시져로 전달하고, 두번째로 out은 처리된 결과를 운영체제로 전달하고, 마지막으로 inout은 in과 out두가지 기능을 동시에 수행.
  • / 는 프로시저를 컴파일 하라는 명령.

 

변수

TYPE 설명
NUMBER 정수나 실수
CHAR 고정길이의 문자
VARCHAR2 가변길이의 문자
DATE 날짜와 시간
BOOLEAN TRUE, FALSE 값

Procedure란?

  • 특정 작업을 수행하는 이름이 있는 PL/SQL Block
  • 쿼리를 하나의 함수처럼 실행하기 위한 쿼리의 집합

 

Procedure 작성

CREATE OR REPLACE Procedure DEPT_insert
(p_DEPTNO in number,
 p_DNAME  in varchar2,
 p_LOC    in varchar2,
 p_RESULT out varchar2)
 
IS
 cnt number := 0;

BEGIN
 SELEECT COUNT(*) INTO CNT
 FROM DEPT
 WHERE DEPTNO = p_DEPTNO
 AND ROWNUM = 1;
 if cnt > 0 then
    p_RESULT := '이미 등록된 부서번호';
 else
    INSERT INTO DEPT(DEPTNO, DNAME, LOC)
    VALUES(p_DEPTNO, p_DNAME, p_LOC);
    COMMIT;
    p_RESULT := '입력완료';
 end if;
 
EXCEPTION
   WHERE OTHERS THEN
      ROLLBACK;
      p_RESULT := 'ERROR';

END;
/

 

Procedure 실행

SELECT * FROM DEPT;

variable rslt varchar2(30);
EXCUTE DEPT_insert(50, 'dev','seoul',:rslt);
print rslt;

//실행한 결과값을 받기 위해 rslt라는 변수를 선언
//EXCUTE로 프로시져를 실행
//print rslt로 실행결과를 확인

Trigger란?

  • 특정한 테이블에 INSERT, UPDATE, DELETE와 같은 DML문이 수행되었을 때, 데이터베이스에서 자동적으로 동작하도록 작성된 프로그램.

 

Trigger 작성

CREATE TABLE ORDER_LIST(
ORDER_DATE CHAR(8) NOT NULL,
PRODUCT VARCHAR2(10) NOT NULL,
QTY NUMBER NOT NULL,
AMOUNT NUMBER NOT NULL);

CREATE TABLE SALES_PER_DATE(
SALE_DATE CHAR(8) NOT NULL,
PRODUCT VARCHAR2(10) NOT NULL,
QTY NUMBER NOT NULL,
AMOUNT NUMBER NOT NULL);
CREATE OR REPLACE Trigger SUMMARY_SALES
   AFTER INSERT
   ON ORDER_LIST
   FOR EACH ROW

DECLARE
  o_date ORDER_LIST.order_date%TYPE;
  o_prod ORDER_LIST.product%TYPE;
  
BEGIN
  o_date := :NEW.order_date;
  o_prod := :NEW.product;
  UPDATE SALES_PER_DATE
    SET qty = qty + :NEW.qty,
    amount = amout + :NEW.amount
  WHERE sale_date = o_date
  AND product = o_prod;
  if SQL%NOTFOUND then
     INSERT INTO SALES_PER_DATE
     VALUES(o_date, o_prod, :NEW.qty, :NEW.amount);
  end if
END;
/
  • AFTER INSERT : INSERT 이후 TRIGGER 발생
  • ON ORDER_LIST : ORDER_LIST 테이블에 TRIGGER 작성
  • FOR EACH ROW : 각 ROW마다 Trigger 작성
  • ORDER_LIST.order_date%TYPE : o_date 변수는 ORDER_LIST의 order_date컬럼의 변수타입으로 선언
  • o_date := :NEW.order_date : ORDER_LIST에 입력된 값을 o_date에 저장
구분 :OLD :NEW
INSERT NULL 입력된 값
UPDATE UPDATE되기 전의 값 UPDATE된 후의 값
DELETE 레코드가 삭제되기 전 값 NULL
  • SQL$NOTFOUND : 위의 조건에 해당하는 값이 없으면 then 다음을 실행

 

Trigger 실행

SELECT * FROM ORDER_LIST;
SELECT * FROM SALES_PER_DATE;
INSERT INTO ORDER_LIST VALUES('20120901', 'MONOPACK', 10, 30000);
COMMIT;

SELECT * FROM ORDER_LIST;
SELECT * FROM SALES_PER_DATE;

// 추가가 된걸 확인할 수 있다.

Procedure와 Trigger의 차이점

프로시저 트리거
CREATE Procedure 문법사용 CREATE Trigger 문법사용
EXCUTE 명령어로 실행  생성 후 자동으로 실행
COMMIT, ROLLBACK 실행 가능 COMMIT, ROLLBACK 실행 안됨
출처 : SQL 전문가 가이드
728x90
반응형

'SQL' 카테고리의 다른 글

SQL  (0) 2019.05.24
DDL / DML / DCL  (0) 2019.04.29
Comments