본문 바로가기
Programming/오라클[SQL]

오라클[sql] PL/SQL

by 콩king 2022. 9. 24.

PL/SQL

▶ PL/SQL

-- 쿼리 ;(세미콜론)을 통해서 항상 한문장 한문장 실행을 했습니다.

-- A 쿼리실행 다음에 B쿼리를 실행해야하는 경우가 발생

-- SQL 순차적으로 처리하기 위한 확장된 언어

-- SQL + 일반프로그래밍언어 결합 : 변수개념도 생기고 제어문개념도 생김

-- 성능향상, 무결성때문에 여러 SQL문장을 하나의 블록으로 구현하는 방법

 

▶ SQL 단점

-- 한번에 하나의 쿼리만 실행

-- if 문을 통해서 쿼리문 전체를 제아가 불가능

-- 변수가 없음

-- 에러처리가 없음
  
▶ PL/SQL 의 유형

-- 익명블록 : 이름이 없고 1회 실행하는 유형

-- 프로시저 : 이름이 존재, 반복된 로직을 실행하는 유형 > DB에 저장된 형태

-- 함수 : 프로시저 중에 리턴이 반드시 있는 유형
   
▶ PL/SQL 구조

-- 블록단위 샐행 : BEGIN END DECLEAR

 

▶DECLEAR

-- 선언부 PLSQL에서 사용하는 모든 변수, 상수를 선언하는 영역

-- DECLARE 변수이름 데이터타입;

-- DECLARE 변수이름 데이터타입 := 값;

-- DECLARE 변수이름 데이터타입 DEFAULT 값;

▶ BEGIN

-- 실행부 순차적으로 실행할 SQL을 작성하는 영역

-- 제어문, 반복, 함수 등등 사용 가능

▶ END

-- PL/SQL종료 >> END; /

▶EXCEPTION

-- 예외처리부 : 에러, 오류가 발생했을 때 예외처리하는 영역

 

구조

DECLARE(선언부)

  -- 변수, 상수, 입력받은 값들을 선언

BEGIN(실행부)

  -- 순차적으로 진행할 SQL을 작성

EXCEPTION(예외처리부)

END;

/

▶ F5를 누르면 pl을 실행해라
▶ 출력메시지가 나오지 않는다면?

>>SET serveroutput ON

 

SET serveroutput ON

▶ 출력내용이 나오지않고 > 실행되었습니다. >오류났습니다. 라는 메시지만 출력하는 것이 기본설정

▶ 기본설정을 변경해야합니다. >> SET serveroutput ON

 

SET serveroutput ON

 

예제

▶예제 1

BEGIN

  DBMS_OUTPUT.PUT_LINE('Hello, World!');

  DBMS_OUTPUT.PUT_LINE('Hello, World!');

  DBMS_OUTPUT.PUT_LINE('Hello, World!');

  DBMS_OUTPUT.PUT_LINE('Hello, World!');

END;
/

 

▶ 예제 2

DECLARE
  name varchar2(15) := '너의이름';
BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello World! ' || name);
END;
/

 

▶ 예제 3

DECLARE

  v_empno VARCHAR2(10);

  v_ename VARCHAR2(20);

BEGIN

  SELECT empno INTO v_empno FROM emp WHERE ename = 'SMITH';


  DBMS_OUTPUT.PUT_LINE('Hello World! ' || v_empno);

 

  -- 이름 : 사원번호에 대한

  SELECT ename INTO v_ename FROM emp WHERE empno = v_empno;

   

  DBMS_OUTPUT.PUT_LINE('Hello World! ' || v_ename);

  

END;

/

 

▶ 예제 4

DECLARE

  v_empno emp.empno%TYPE;

  v_ename emp.ename%TYPE;

  v_hiredate emp.hiredate%TYPE;

BEGIN

  SELECT empno, ename, hiredate

  INTO v_empno, v_ename, v_hiredate

  FROM emp

  WHERE ename='SMITH';

  

  DBMS_OUTPUT.PUT_LINE('사번 # ' || v_empno);

  DBMS_OUTPUT.PUT_LINE('이름 # ' || v_ename);

  DBMS_OUTPUT.PUT_LINE('입사일 # ' || v_hiredate);

END;

/

 

▶ 예제 5

ACCEPT p_ename PROMPT '조회할 사원 이름은?';

DECLARE

  emp_record emp%ROWTYPE;

  v_ename emp.ename%TYPE := '&p_ename';

BEGIN

  SELECT * -- * : 테이블%ROWTYPE 이 정의되었을때만 사용가능

  INTO emp_record

  FROM emp

  WHERE ename = UPPER(v_ename);

 

  DBMS_OUTPUT.PUT_LINE('사번 # ' || emp_record.empno);

  DBMS_OUTPUT.PUT_LINE('이름 # ' || emp_record.ename);

  DBMS_OUTPUT.PUT_LINE('업무 # ' || emp_record.job);

  

EXCEPTION

  WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('&p_ename'||' 자료가 없습니다.');

  WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('&p_ename'||' 자료가 2건 이상입니다.');

  WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('검색시 오류가 발생했습니다.');

END;

/

'Programming > 오라클[SQL]' 카테고리의 다른 글

오라클[sql] 반복문  (0) 2022.09.24
오라클[sql] 조건문 IF / CASE  (0) 2022.09.24
오라클[sql] 시퀀스 / 인덱스  (0) 2022.09.24
오라클[sql] merge / commit / rollback  (0) 2022.09.24
오라클[sql] 연습문제  (0) 2022.09.24

댓글