yooniiverse
개발 블로그
yooniiverse
전체 방문자
오늘
어제
  • 분류 전체보기
    • 운영체제
    • 네트워크
    • ~2023.02
      • 외부교육
      • 대외활동
      • 스터디
      • 동아리
      • TIL
      • IT지식
      • 기타
      • 트러블 슈팅
      • 프로그래밍
      • Python
      • Java
      • JS
      • DB(SQL)
      • JSP
      • Spring
      • 기술면접
      • 자바
      • 코딩테스트
      • 자료구조
      • 알고리즘
      • 백준 문제풀이
      • 인공지능
      • 머신러닝
      • 프로젝트
      • 안드로이드 앱개발
      • 웹개발
      • 웹 서비스
      • 웹퍼블리싱
      • Node.js 백엔드 개발
      • CS
      • 1일 1CS지식
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 정보처리기사
      • 도서 리뷰
      • 개발 관련 도서
      • 기타 도서

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yooniiverse

개발 블로그

~2023.02/DB(SQL)

저장 프로시저와 저장 함수

2022. 4. 14. 18:45

-- 1. 저장 프로시저
-- 실습: 저장 프로시저 생성하기
-- 사원 테이블에 저장된 모든 사원을 삭제하는 프로시저 작성

DROP TABLE EMP01;

CREATE TABLE EMP01
AS
SELECT * FROM EMP;

SELECT * FROM EMP01;

CREATE OR REPLACE PROCEDURE DEL_ALL
IS
BEGIN
    DELETE FROM EMP01;
END;
/

EXECUTE DEL_ALL;

SELECT * FROM EMP01;


-- 저장 프로시저의 오류 원인 살피기

DROP TABLE EMP01;

CREATE TABLE EMP01
AS
SELECT * FROM EMP;

SELECT * FROM EMP01;

DROP PROCEDURE DEL_ALL;

CREATE OR REPLACE PROCEDURE DEL_ALL
IS
-- BEGIN
    DELETE FROM EMP01;
END;
/

SHOW ERROR


-- 저장 프로시저 조회하기
-- 사용자가 저장 프로시저를 생성했는지 확인하려면 USER_SOURCE를 살펴보면 된다.

DESC USER_SOURCE
SELECT NAME, TEXT FROM USER_SOURCE;

 


-- 2. 저장 프로시저의 매개 변수
-- 저장 프로시저에 값을 전달해 주기 위해서 매개 변수를 사용한다.

DROP TABLE EMP01;

CREATE TABLE EMP01
AS
SELECT * FROM EMP;

SELECT * FROM EMP01;

CREATE OR REPLACE PROCEDURE DEL_ENAME(VENAME EMP01.ENAME%TYPE)
IS
BEGIN
    DELETE FROM EMP01
    WHERE ENAME=VENAME;
END;
/

SELECT * FROM EMP01 WHERE ENAME='SMITH';

EXECUTE DEL_ENAME('SMITH');

SELECT * FROM EMP01 WHERE ENAME='SMITH';

 


-- 3. IN, OUT, INPUT 매개 변수
-- IN 매개 변수

CREATE PROCEDURE DEL_ENAME(VENAME IN EMP01.ENAME%TYPE)


-- OUT 매개 변수

DROP PROCEDURE SEL_EMPNO;

CREATE OR REPLACE PROCEDURE SEL_EMPNO(
    VEMPNO IN EMP.EMPNO%TYPE,
    VENAME OUT EMP.ENAME%TYPE,
    VSAL OUT EMP.SAL%TYPE,
    VJOB OUT EMP.JOB%TYPE
)
IS
BEGIN
    SELECT ENAME, SAL, JOB INTO VENAME, VSAL, VJOB
    FROM EMP
    WHERE EMPNO=VEMPNO;
END;
/

-- 바인드 변수
-- ':'를 덧붙여주는 변수는 미리 선언되어 있어야 한다.
VARIABLE VAR_ENAME VARCHAR2(15);
VARIABLE VAR_SAL NUMBER;
VARIABLE VAR_JOB VARCHAR2(9);

-- OUT 매개 변수에서 값을 받아오기 위해서는 프로시저 호출 시 변수 앞에 ':'를 덧붙인다.
EXECUTE SEL_EMPNO(7788, :VAR_ENAME, :VAR_SAL, :VAR_JOB);

PRINT VAR_ENAME;

SELECT ENAME, SAL FROM EMP WHERE EMPNO=7788;


-- IN, OUT 매개변수 활용
-- 사원명으로 검색하여 해당 사원의 직급을 얻어 오는 저장 프로시저를 SEL_EMPNAME라는 이름으로 작성하라.

CREATE OR REPLACE PROCEDURE SEL_EMPNAME(
    VENAME IN EMP.ENAME%TYPE,
    VJOB OUT EMP.JOB%TYPE
)
IS
BEGIN
    SELECT JOB INTO VJOB
    FROM EMP
    WHERE ENAME = VENAME;
END;
/

VARIABLE VAR_JOB VARCHAR2(9);
EXECUTE SEL_EMPNAME('SCOTT', :VAR_JOB);
PRINT VAR_JOB



-- 4. 저장함수
-- 저장 프로시저와 거의 유사한 용도로 사용된다.
-- 차이점은 함수는 실행 결과를 되돌려 받을 수 있다는 점이다.

-- 실습: 저장함수 작성하기
-- 특별 보너스를 지급하기 위한 저장함수를 작성해보자. 보너스는 급여의 200%를 지급한다고 가정한다.

CREATE OR REPLACE FUNCTION CAL_BONUS(VEMPNO IN EMP.EMPNO%TYPE)
    RETURN NUMBER
IS
    VSAL NUMBER(7, 2);
BEGIN
    SELECT SAL INTO VSAL
    FROM EMP
    WHERE EMPNO=VEMPNO;
    
    RETURN  (VSAL*2);
END;
/

VARIABLE VAR_RES NUMBER;
EXECUTE :VAR_RES := CAL_BONUS(7788);
PRINT VAR_RES;



-- 실습: 판매된 도서에 대한 이익을 계산하는 함수
-- 판매된 도서의 이익을 계산하기 위해 각 주문 건별로 실제 판매가격인 SALEPRICE를 입력받아

-- 가격에 맞는 이익(30,000원 이상이면 10%, 30,000원 미만이면 5%)을 계산해 반환하는 함수를 작성

CREATE OR REPLACE FUNCTION FNC_INTEREST(PRICE NUMBER)
    RETURN NUMBER
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;
/



-- 저장함수 생성
-- 사원명으로 검색하여 해당 사원의 직급을 얻어 오는 저장 함수를 SEL_EMPNAME02라는 이름으로 작성하라.

CREATE FUNCTION SEL_EMPNAME02(VENAME IN EMP.ENAME%TYPE)
    RETURN VARCHAR2
IS
    VJOB EMP.JOB%TYPE;
BEGIN
    SELECT JOB INTO VJOB
    FROM EMP
    WHERE ENAME = VENAME;
    
    RETURN VJOB;
END;
/

VARIABLE VAR_JOB VARCHAR2(9); -- SQL SESSION에 저장되는 변수 선언
EXECUTE :VAR_JOB := SEL_EMPNAME02('SCOTT');
PRINT VAR_JOB;

'~2023.02 > DB(SQL)' 카테고리의 다른 글

패키지  (0) 2022.04.15
커서와 트리거  (0) 2022.04.14
PL/SQL  (0) 2022.04.12
사용자 관리  (0) 2022.04.12
시퀀스  (0) 2022.04.11
    '~2023.02/DB(SQL)' 카테고리의 다른 글
    • 패키지
    • 커서와 트리거
    • PL/SQL
    • 사용자 관리
    yooniiverse
    yooniiverse

    티스토리툴바