[PL/SQL] 기초 데이터 준비 / 변수선언 / 기본 구문

Gabriela·2023년 7월 12일

[SQL] 데이터베이스

목록 보기
11/13
post-thumbnail

‣ PL/SQL

  • 오라클 문법이다.
  • 프로그래밍이 가능한 SQL문(쿼리문) 작성 방법이다.
  • 프로시저, 사용자 함수 등의 기반이 되는 언어이다.
  • 항상 블록을 잡고 실행한다.
형식
[DECLARE 변수 선언]     -- 추가 안 할수도 있음
BEGIN 
실행문
END;

(문장이 끝날때 마다 ;(세미콜론) 붙이기)


기초데이터 준비

다른 계정의 테이블을 현재 계정으로 복사해서 사용
DROP TABLE EMPLOYEES;
CREATE TABLE EMPLOYEES AS (
    SELECT *
      FROM HR.EMPLOYEES
);
-- 기본키/외래키 제약 조건은 복사가 되지 않는다.
ALTER TABLE EMPLOYEES ADD CONSTRAINT PK_EMP PRIMARY KEY(EMPLOYEE_ID);

‣ 서버 메세지 출력하기

  • 기본적으로 서버 메시지는 출력되지 않는다.
  • 서버 메시지 출력을 위해서 최초 1회 아래 쿼리문을 실행한다
    SET SERVEROUTPUT ON;  -- 디폴트가 OFF로 되어있음
  • 출력하는 방법
    DBMS_OUTPUT.PUT_LINE(출력할내용);

‣ 변수 선언하기

  • 값을 저장할 때 대입 연산자(:=)
  • 타입을 선언하는 방식
    1) 스칼라 변수 : 타입을 직접 지정한다.
    2) 참조 변수 : 특정 칼럼의 타입을 그대로 사용한다

스칼라 변수

-- 1. 스칼라 변수(직접 타입을 명시하는 방법)
DECLARE 
    NAME VARCHAR2(20 BYTE);
    AGE  NUMBER(3);
BEGIN
    NAME := 'tom';
    AGE  := 30;
    DBMS_OUTPUT.PUT_LINE('이름은 ' || NAME || '입니다.');
    DBMS_OUTPUT.PUT_LINE('나이는 ' || AGE || '살입니다.');
END;

참조 변수

DECLARE
    EMPLOYEEID EMPLOYEES.EMPLOYEE_ID%TYPE;  -- %TYPE 정해진 키워드
    FIRSTNAME  EMPLOYEES.FIRST_NAME%TYPE;
    LASTNAME   EMPLOYEES.LAST_NAME%TYPE;
BEGIN
    SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME
      INTO EMPLOYEEID, FIRSTNAME, LASTNAME
      FROM EMPLOYEES
     WHERE EMPLOYEE_ID = 100;
    DBMS_OUTPUT.PUT_LINE(EMPLOYEEID || ', ' || FIRSTNAME || ', ' || LASTNAME);
END;

‣ IF 구문

    IF 조건식1 THEN 
        실행문1
    ELSIF 조건식2 THEN
        실행문2
    ...
    ELSE
        실행문N
    END IF;

‣ CASE 구문

    CASE
        WHEN 조건식1 THEN
            실행문1
        WHEN 조건식2 THEN
            실행문2
        ...
        ELSE        -- ELSE는 생략 가능
            실행문N
    END CASE;

‣ WHILE 구문

  • WHILE 문 사용 예시 : DB데이터를 가져와야 하는데 DB데이터가 몇개인지 모를 때 사용
    WHILE 조건식 LOOP
        실행문
    END LOOP;

‣ FOR 구문

    FOR 변수 IN 시작값..종료값 LOOP
        실행문
    END LOOP;

‣ EXIT / CONTINUE

반복문을 사용할 때 쓰는 보조 제어문

  • EXIT : 반복문(WHILE, FOR) 종료하기
  • CONTINUE : 반복문의 시작부터 다시 실행하기 (무언가를 제외하고 싶을 때 사용)

EXIT 활용 예제

-- 1부터 누적하기. 누적 결과가 100을 넘어가면 그만 누적하고 출력하기
DECLARE
    N     NUMBER;
    TOTAL NUMBER;
BEGIN
    N := 1;
    TOTAL := 0;     -- 합계변수의 기본 초기값 : 0
    -- 무한루프(끝내고 싶을 때 EXIT를 적어줌)
    WHILE TRUE LOOP
        IF TOTAL > 100 THEN
            EXIT;
        END IF;
        TOTAL := TOTAL + N;
        N := N + 1;
    END LOOP;
    -- 결과 확인
    DBMS_OUTPUT.PUT_LINE(N || ', ' || TOTAL);
END;

CONTINUE 활용 예제

-- 1부터 누적하기. 3의 배수는 제외하고 누적하기. 누적 결과가 100이 넘어가면 그만 누적하고 결과 출력하기
DECLARE
    N       NUMBER;
    TOTAL   NUMBER;
    MODULAR NUMBER;
BEGIN
    -- 초깃값
    N := 0;
    TOTAL := 0;
    MODULAR := 0;
    -- 무한루프
    WHILE TRUE LOOP
        -- N의 증가
        N := N + 1;
        -- 누적 결과가 100이 넘어가면 그만 누적하기
        IF TOTAL > 100 THEN
            EXIT;
        END IF;
        -- 3의 배수는 누적에서 제외하기
        SELECT MOD(N, 3) INTO MODULAR   -- 3으로 나눈 나머지를 MODULAR 변수에 저장
          FROM DUAL;
        IF MODULAR = 0 THEN
            CONTINUE;   -- WHILE TRUE LOOP문의 첫 실행문으로 되돌아가서 실행하시오.
        END IF;
        -- 누적
        TOTAL := TOTAL + N;
    END LOOP;
    -- 결과확인
    DBMS_OUTPUT.PUT_LINE(N || ', ' || TOTAL);
END;

‣ 예외처리 구문

    EXCEPTION
        WHEN 예외종류1 THEN
            예외처리1
        WHEN 예외종류2 THEN
            예외처리2
        ...
        WHEN OTHERS THEN
            예외처리N

NO_DATA_FOUND 활용 예제

-- 데이터를 찾지 못하는 경우의 예외 : NO_DATA_FOUND
DECLARE
    EMPLOYEEID EMPLOYEES.EMPLOYEE_ID%TYPE;
    FIRSTNAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
    EMPLOYEEID := 0;       -- 예외를 발생시키기 위해 일부러 만듬
    SELECT FIRST_NAME INTO FIRSTNAME
      FROM EMPLOYEES
     WHERE EMPLOYEE_ID = EMPLOYEEID;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE(EMPLOYEEID || '번 사원은 없습니다.');
END;

TOO_MANY_ROWS 활용 예제

-- 데이터가 너무 많은 경우 : TOO_MANY_ROWS
DECLARE
    FIRSTNAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN 
    SELECT FIRST_NAME INTO FIRSTNAME
      FROM EMPLOYEES
     WHERE EMPLOYEE_ID BETWEEN 100 AND 206;
EXCEPTION
    WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('결과가 너무 많다.');
END;

OTHERS 활용예제

-- 모든 예외를 처리하는 방법 : OTHERS
DECLARE
    FIRSTNAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN 
    SELECT FIRST_NAME INTO FIRSTNAME
      FROM EMPLOYEES
     WHERE EMPLOYEE_ID BETWEEN 100 AND 206;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLCODE);  -- 예외코드 확인
        DBMS_OUTPUT.PUT_LINE(SQLERRM);  -- 예외메시지 확인
END;

✍️
BEGIN의 끝에서 COMMIT
EXCEPTION 에서 ROLLBACK


😊와,, 정말 재밌는데 짱 피곤하다👍👍


profile
개발이 세상에서 제일 재밌어요

0개의 댓글