1. PL/SQL
- Procedural Language/Structured Query Language의 줄임말로 데이터베이스 응용 프로그램을 작성하는 데 사용하는 오라클의 SQL 전용 언어.
 - SQL 전용 언어로 SQL 문에 변수, 제어, 입출력 등의 프로그래밍 기능을 추가하여 SQL 만으로 처리하기 어려운 문제를 해결함.
 - PL/SQL은 SQL Developer에서 바로 작성하고 컴파일한 후 결과를 실행함
 - 파이썬, 자바로 DB 데이터를 뽑아서도 가능하나 확실히 속도가 빠르다.
 

2. 프로시저
리턴 값이 없음, 리턴 값이 있으면 함수
2.(1) 삽입 작업 프로시저
- 프로시저로 데이터를 삽입 작업을 하면 좀 더 복잡한 조건의 삽입 작업을 인자 값만 바꾸어 수행할 수도 있고, 저장해두었다가 필요할 때마다 호출하여 사용할 수도 있음
 - 유효성 검사도 됨
 
-- 프로시저
CREATE OR REPLACE PROCEDURE InsertBook(
    myBookID IN NUMBER,
    myBookName IN VARCHAR2,
    myPublisher IN VARCHAR2,
    myPrice IN NUMBER)
AS BEGIN
    INSERT INTO Book(bookid, bookname, publisher, price)
    VALUES(myBookID, myBookName, myPublisher, myPrice);
END;
-- 프로시저(실행부)
EXEC INSERTBOOK(13, '스포츠과학', '마당과학서적', 25000);
-- 확인작업
SELECT * FROM BOOK;
2.(2) 제어문을 사용하는 프로시저
- PL/SQL의 제어문은 어떤 조건에서 어떤 코드가 실행되어야 하는지를 제어하기 위한 문법으로, 절차적 언어의 구성요소를 포함함
 

- 예제
 
create or replace PROCEDURE BookInsertOrUpdate(
  myBookID NUMBER,
  myBookName VARCHAR2,
  myPublisher VARCHAR2,
  myPrice INT)
AS
  mycount NUMBER;
BEGIN
  SELECT COUNT(*) INTO mycount FROM Book
  WHERE bookname LIKE myBookName;
  IF mycount!=0 THEN
      UPDATE Book SET price = myPrice
      WHERE bookname LIKE myBookName;
  ELSE
      INSERT INTO Book(bookid, bookname, publisher, price)
      VALUES(myBookID, myBookName, myPublisher, myPrice);
  END IF;
END;
- IN, OUT, INOUT 매개변수
- IN 변수는 프로시저 내에서 값을 읽기만 할 수 있으며, 프로시저를 호출할 때 전달된 값을 읽어들입니다. 이 변수는 프로시저 내부에서 변경될 수 없습니다. 자바의 final처럼 수정할 수 없는 변수입니다.
 - OUT 변수는 프로시저 내에서 값을 쓰기만 할 수 있으며, 프로시저를 호출할 때 전달된 변수에 값을 할당합니다. 이 변수는 프로시저 내부에서 읽을 수 없습니다.
 - IN OUT 변수는 프로시저 내에서 값을 읽고 쓸 수 있으며, 프로시저를 호출할 때 전달된 변수에 값을 할당하고 읽어들입니다.
 
 
2.(3) 결과를 반환하는 프로시저
- 예제
 
CREATE OR REPLACE PROCEDURE AveragePrice(
    AverageVal OUT NUMBER)
AS
BEGIN
SELECT AVG(price) INTO AverageVal FROM Book WHERE price IS NOT
NULL;
END;
SET SERVEROUTPUT ON;  
DECLARE  
AverageVal NUMBER;  
BEGIN  
AveragePrice(AverageVal);  
DBMS\_OUTPUT.PUT\_LINE('책값 평균: '|| AverageVal);  
END;
2.(4) 커서를 사용하는 프로시저
- 커서(cursor)는 실행 결과 테이블을 한 번에 한 행씩 처리하기 위하여 테이블의 행을 순서대로 가리키는 데 사용함.
 


- 예제
 
CREATE OR REPLACE PROCEDURE Interest
AS
    myInterest NUMERIC;
    Price NUMERIC;
    CURSOR InterestCursor IS SELECT saleprice FROM Orders;
BEGIN
   myInterest := 0.0;
   OPEN InterestCursor;
   LOOP
       FETCH InterestCursor INTO Price;
       EXIT WHEN InterestCursor%NOTFOUND;
       IF Price >= 30000 THEN
           myInterest := myInterest + Price * 0.1;
       ELSE
           myInterest := myInterest + Price * 0.05;
       END IF;
    END LOOP;
    CLOSE InterestCursor;
    DBMS_OUTPUT.PUT_LINE(' 전체 이익 금액 = ' || myInterest);
END;
트리거
- 트리거(trigger)는 데이터의 변경(INSERT, DELETE, UPDATE)문이 실행될 때 자동으로 따라서 실행되는 프로시저를 말함.
 

사용자 정의함수
- 사용자 정의 함수는 수학의 함수와 마찬가지로 입력된 값을 가공하여 결과 값을 되돌려줌.
 - 판매된 도서에 대한 이익을 계산하는 함수(fnc_Interest)
 
CREATE OR REPLACE FUNCTION fnc_Interest(
    price NUMBER) RETURN INT
  IS
     myInterest NUMBER;
  BEGIN
  /* 가격이 30,000원 이상이면 10%, 30,000원 미만이면 5% */
    IF Price >= 30000 THEN myInterest := Price * 0.1;
    ELSE myInterest := Price * 0.05;
   END IF;
   RETURN myInterest;
  END;
/* Orders 테이블에서 각 주문에 대한 이익을 출력 */
SELECT custid, orderid, saleprice, fnc_Interest(saleprice) interest
FROM Orders;
프로시저, 트리거, 사용자 정의 함수의 공통점과 차이점

'데이터 엔지니어링 > 데이터베이스 및 운영체제' 카테고리의 다른 글
| ER 다이어그램 실습(ORALCE) (0) | 2023.03.24 | 
|---|---|
| 데이터베이스 모델링 (0) | 2023.03.24 | 
| SQL - 인덱스 (0) | 2023.03.24 | 
| SQL(ORACLE) 시스템 및 DML 권한 명령어 모음 (0) | 2023.03.24 | 
| SQL - 뷰 (0) | 2023.03.24 |