데이터베이스

[ORACLE] PL/SQL - PL/SQL 구조와 변수

Seong-Jun 2025. 3. 17. 22:57
728x90
반응형
SMALL

PL/SQL이란?

PL/SQL : PROCEDURE LANGUAGE EXTENSION TO SQL

 

오라클 자체에 내장되어 있는 절차적 언어로 SQL 문장 내에서 변수 정의, 조건문, 반복문 등을 지원하고 다수의 SQL문을 한 번에 실행할 수 있다. SQL의 단점을 보완해준다.

 

구조

선언부

  • DECLARE로 시작.
  • 변수나 상수를 초기화하는 부분이고 생략이 가능하다.

실행부

  • BEGIN ~ END 사이의 부분으로 BEGIN으로 시작하고 END로 끝낸다.
  • SQL문 또는 제어문 로직을 작성하는 부분이다.

예외 처리부

  • EXCEPTION으로 시작하고 예외 발생 시 해결하기 위한 부분이다. 생략이 가능하다.

PL/SQL의 실행 결과를 출력하기 위한 설정

-- * 화면에 표시하기 위한 설정
SET SERVEROUTPUT ON;

 

PL/SQL은 큰 따옴표("")가 아닌 작은따옴표('')로 문자를 출력할 수 있다.

BEGIN
	DBMS_OUTPUT.PUT_LINE('HELLO ORACLE'); -- "" X
END;

 

변수

변수 또는 상수는 선언부에서 선언 및 초기화를 할 수 있다.

데이터타입 선언 종류

  • 일반타입
  • 참조(래퍼런스) 타입
  • ROW 타입

일반 타입 변수

변수명 [CONSTANT] 자료형 [:= 값]

 

  • 상수 선언 시 CONSTANT 키워드를 사용한다
  • 초기화 시 := 기호를 사용한다 ( = 아님!! )
DECLARE
	EID NUMBER;
	ENAME VARCHAR2(20);
	PI CONSTANT NUMBER := 3.14;

BEGIN
	-- 변수에 값을 대입
	EID := 100;
	ENAME := '임성준';
	
	-- || : 연결 연산자
	DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
	DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
	DBMS_OUTPUT.PUT_LINE('PI : ' || PI);
END;
/ -- PL/SQL은 / 로 구분한다!

 

값을 입력받아 변수에 대입하기

DECLARE
	EID NUMBER;
	ENAME VARCHAR2(20);
	PI CONSTANT NUMBER := 3.14;

BEGIN	
	ENAME := '임성준';
	EID := &사원번호; -- 사용자로부터 입력받기 ☞ &대체변수명
	
	DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
	DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
	DBMS_OUTPUT.PUT_LINE('PI : ' || PI);
END;
/

 

=> 값을 입력받을 경우 & 기호를 사용한다!!

 

참조 타입 변수

변수명 테이블명.컬럼명%TYPE

 

어떤 테이블의 어떤 컬럼의 데이터 타입을 참조하여 해당 타입으로 선언된 변수이다.

 

DECLARE
	EID EMPLOYEE.EMP_ID%TYPE;
	ENAME EMPLOYEE.EMP_NAME%TYPE;
	SAL EMPLOYEE.SALARY%TYPE;
BEGIN
	-- EMPLOYEE 테이블에서 입력받은 사번에 대한 서원 정보를 조회
	
	SELECT EMP_ID, EMP_NAME, SALARY
	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;
/

 

ROW 타입 변수

변수명 테이블명%ROWTYPE;

 

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

DECLARE
	E EMPLOYEE%ROWTYPE;
BEGIN
	SELECT * 
	INTO E
	FROM EMPLOYEE
	WHERE EMP_ID = &사번;
	DBMS_OUTPUT.PUT_LINE('사원명 : ' || E.EMP_NAME);
	DBMS_OUTPUT.PUT_LINE('급여 : ' || E.SALARY);
	DBMS_OUTPUT.PUT_LINE('보너스 : ' || TO_CHAR(NVL(E.BONUS, 0), '0.0'));
	DBMS_OUTPUT.PUT_LINE('보너스 : ' || '없음');
	
END;
/

 

728x90
반응형
LIST