본문 바로가기
SQL

SQL 8일차(1)

by teg0 2025. 8. 4.

<PL/SQL>

        오라클 DBMS에서 사용하는 절차적 SQL 확장 언어이다.
        일반 SQL의 단점을 보완해서 변수의 정의, 조건(IF), 반복(FOR, WHILE)등을 지원하여
            다수의 SQL문을 한번에 실행할 수 있음.
        PL/SQL은 블록구조를 사용함.
            -블록구조는 {}를 사용해서 코드를 나누거나 TAB(들여쓰기)를 통해 코드를 나누는
                것을 블록구조라고 한다.
        
        PL/SQL 구조
        DECLARE         --(선택)선언부 : 변수, 상수등을 선언
        BEGIN           --(필수)실행부 : SQL문 또는 제어문 등의 로직을 기술
        EXCEPTION       --(선택)예외처리부 : 오류 발생시 처리
        END;            --(필수)PL/SQL의 마지막에 기술

 

출력 활성화

SET SERVEROUTPUT ON;

 

간단한 BEGIN END 문법으로 TEXT 출력하기

BEGIN
    DBMS_OUTPUT.PUT_LINE('HELLO ORACLE');
END;

 

1.DECLARE 선언부

        변수(식별가능한 이름을 메모리에 부여하고 메모리를 할당하고 값을 저장하다가 
            필요할 때 값을 가져오는) 및 상수를 선언하는 공간
        일반타입, 레퍼런스타입, ROW타입 변수가 있다.
    
        1-1) 일반타입 변수 선언 및 초기화
        DECLARE 
            변수명 [CONSTANT] 자료형 [:= 초기값]

 

DECLARE
    EID NUMBER; 
    ENAME VARCHAR2(20);
    PI CONSTANT NUMBER :=3.14;
BEGIN
    EID := 800;
    ENAME := '홍길동';
    
    DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
    DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('PI : ' || PI);
END;
/

변수 선언과 상수 선언, 변수에 값을 대입 후 출력하기

 

DECLARE
    EID NUMBER; 
    ENAME VARCHAR2(20);
    PI CONSTANT NUMBER :=3.14;
BEGIN
    EID := &번호;
    ENAME := '&이름';
    
    DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
    DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('PI : ' || PI);
END;
/

&를 사용하여 값을 입력 받는다.

 

1-2) 레퍼런스(참조) 타입 변수

    어떤 테이블의 어떤 컬럼의 데이터 타입을 참조해서 사용할지를 정하는 방식

 

DECLARE
    EID EMPLOYEE.EMP_ID%TYPE; 
    ENAME EMPLOYEE.EMP_NAME%TYPE;
    SAL EMPLOYEE.SALARY%TYPE;
BEGIN
--    EID := 800;
--    ENAME := '이이';
--    SAL := 1000000;
    
    SELECT EMP_ID, EMP_NAME, SALARY -- EMPLOYEE 테이블에서 값을 가져와 INTO 변수에
                                    --      값을 넣는다.
    INTO EID, ENAME, SAL
    FROM EMPLOYEE
    WHERE EMP_ID = &사번;
    
    DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
    DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('SAL : ' || SAL);
    
END;
/

변수명    테이블.컬럼명%TYPE으로 참조할 수 있다.

SELECT문으로 테이블에서 값을 가져올 수 있다.

 

1-3) ROW타입 변수 선언

        테이블의 한 행에 대한 모든 컬럼을 한번에 담을 수 있는 변수
        변수명 테이블명%ROWTYPE

 

DECLARE
    E EMPLOYEE%ROWTYPE;
BEGIN
    SELECT *
    INTO E
    FROM EMPLOYEE
    WHERE EMP_ID = &사번;
    
    DBMS_OUTPUT.PUT_LINE(E.EMP_ID ||', ' || E.EMP_NAME ||', ' || E.BONUS);
END;
/

한 행 전체의 데이터를 가져온다.

 

2. BEGIN 실행부

<조건문>

IF 조건식 THEN

    실행내용 
END IF;


IF 조건식 THEN
    실행내용
ELSE
    실행내용
END IF;

 

IF 조건식1
    THEN 실행내용
ELSIF 조건식2
    THEN
...
ELSE 
    실행내용
END IF;

 

<반복문>

 

LOOP
     반복하고 싶은 실행문
     *EXIT WHEN 탈출조건
END LOOP;

 

탈출조건은 조건식
       1) IF 조건식 THEN EXIT; END IF;
       2) EXIT WHEN 조건식;

 

FOR 변수 IN [REVERSE] 초기값... 최종값
LOOP
    반복할 코드
END LOOP;

 

WHILE 반복문이 수행될 조건
LOOP
    반복할 명령어
END LOOP;

 

DROP TABLE TEST;

CREATE TABLE TEST(
    TNO NUMBER PRIMARY KEY,
    TDATE DATE
);

CREATE SEQUENCE SEQ_TNO;

DECLARE
    I NUMBER := 1;

BEGIN
    FOR I IN 1..10
    LOOP
        INSERT INTO TEST VALUES(SEQ_TNO.NEXTVAL, SYSDTAE);
    END LOOP;
END;
/

테이블, 시퀀스를 생성하고 FOR문에 INSERT를 추가하여 10번의 INSERT를 실행시킨다.

3. 예외처리

    예외(EXCEPTION) : 실행 중 발생하는 오류
    
    EXCEPTION
        WHEN 예외명1 THEN 처리구문1;
        WHEN 예외명2 THEN 처리구문2;
        WHEN 예외명3 THEN 처리구문3;
        ...
    시스템 예외(오라클이 미리 설정해둔 예외)
        -NO_DATA_FOUND : SELECT한 결과가 한 행도 없을 때
        -TOO_MANY_ROWS : SELECT한 결과가 여러행일 경우
        -ZERO_DIVDE : 0으로 나눌 경우
        -DUP_VAL_ON_INDEX : UNIQUE 제약조건 위배
        ...

 

BEGIN
    UPDATE EMPLOYEE
    SET EMP_ID = &변경할사번
    WHERE EMP_NAME = '노옹철';
    
EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('이미 존재하는 사번입니다.');
END;
/

노옹철의 사번을 입력받는데 같은 값이 이미 존재할 경우 예외처리를 한다.

'SQL' 카테고리의 다른 글

SQL 9일차(OLD, NEW 응용)  (1) 2025.08.05
SQL 8일차(2)  (0) 2025.08.04
SQL 7일차(2)  (0) 2025.08.01
SQL 7일차(1)  (3) 2025.08.01
SQL 6일차(3)  (2) 2025.07.31