1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (187)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (27)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
      • TIL (1)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

[PL/SQL] 사용자 정의함수
📃 DATABASE/ORACLE

[PL/SQL] 사용자 정의함수

2018. 1. 22. 23:37

사용자 정의함수


구조

1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION 함수명 (매개변수1, 매개변수2, ...)
RETURN  데이터타입
IS[AS]
    변수, 상수 등 선언
BEGIN
    실행부
 
    RETURN 반환값;
[EXCEPTION
    예외처리부]
END 함수명;
Colored by Color Scripter
cs


CREATE OR REPLACE FUNCTION  최초 함수를 만들고나서 수정을 하더라도 계속 컴파일할 수 있고 마지막으로 수정된 최종본이 반영된다.

매개변수  "매개변수명 데이터타입" 형태로 명시한다. 생략가능

RETURN  데이터타입  함수가 반환할 데이터 타입을 정한다.

RETURN 반환값  특정 연산을 진행한 후 반환할 값을 명시한다.


예제

1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION MY_MOD(NUM1 NUMBER, NUM2 NUMBER)
    RETURN NUMBER                               -- 반환타입 NUMBER
IS
    VN_REMAINDER    NUMBER := 0;                -- 반환할 나머지
    VN_QUOTIENT     NUMBER := 0;                -- 몫
BEGIN
    VN_QUOTIENT := FLOOR(NUM1 / NUM2);          -- 정수부분 거르기
    VN_REMAINDER:= NUM1 - (NUM2 * VN_QUOTIENT); -- 나머지
    
    RETURN VN_REMAINDER;                        -- 나머지 반환
END;
Colored by Color Scripter
cs



함수는 반환값이 있으므로 SELECT 문장에서 사용할 수 있고, PL/SQL 블록 내에서도 사용할 수 있다.


1
2
SELECT  MY_MOD(14, 3) AS REMAIND
FROM    DUAL;
cs



국가테이블을 읽어 국가번호를 받아 국가명을 반환하는 함수를 작성해보자.


1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION FN_GET_COUNTRY_NAME(P_COUNTRY_ID NUMBER)
    RETURN  VARCHAR2
IS
    VN_COUNTRY_NAME     COUNTRIES.COUNTRY_NAME%TYPE;
BEGIN
    SELECT  COUNTRY_NAME
    INTO    VN_COUNTRY_NAME
    FROM    COUNTRIES
    WHERE   COUNTRY_ID = P_COUNTRY_ID;
    
    RETURN VN_COUNTRY_NAME;
END;
Colored by Color Scripter
cs



1
2
3
SELECT  FN_GET_COUNTRY_NAME(52777)   COUNTRY1
        , FN_GET_COUNTRY_NAME(10000) COUNTRY2
FROM    DUAL;
Colored by Color Scripter
cs



그렇담, 값이 존재하지 않을때 '없음'이라고 반환하려면 어떻게 해야할까?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE FUNCTION FN_GET_COUNTRY_NAME(P_COUNTRY_ID NUMBER)
    RETURN  VARCHAR2
IS
    VN_COUNT            NUMBER := 0;
    VN_COUNTRY_NAME     COUNTRIES.COUNTRY_NAME%TYPE;
BEGIN
    SELECT  COUNT(*)
    INTO    VN_COUNT
    FROM    COUNTRIES
    WHERE   COUNTRY_ID = P_COUNTRY_ID;
    
    IF  VN_COUNT = 0 THEN
        VN_COUNTRY_NAME := '없음';
    ELSE
        SELECT  COUNTRY_NAME
        INTO    VN_COUNTRY_NAME
        FROM    COUNTRIES
        WHERE   COUNTRY_ID = P_COUNTRY_ID;
    END IF;
    
    RETURN VN_COUNTRY_NAME;
END;
Colored by Color Scripter
cs



1
2
3
SELECT  FN_GET_COUNTRY_NAME(52777)   COUNTRY1
        , FN_GET_COUNTRY_NAME(10000) COUNTRY2
FROM    DUAL;
Colored by Color Scripter
cs



접속한 사용자 확인 함수를 작성해보자.


1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION FN_GET_USER
    RETURN  VARCHAR2
IS
    VS_USER_NAME    VARCHAR2(80);
BEGIN
    SELECT  USER
    INTO    VS_USER_NAME
    FROM    DUAL;
    
    RETURN  VS_USER_NAME;
END;
Colored by Color Scripter
cs



1
2
SELECT  FN_GET_USER
FROM    DUAL;
cs



반응형
저작자표시 비영리 변경금지 (새창열림)

'📃 DATABASE > ORACLE' 카테고리의 다른 글

[PL/SQL] 예외처리 (1) : 예외처리란?  (0) 2018.01.24
[PL/SQL] 프로시저(PROCEDURE)  (0) 2018.01.23
[PL/SQL] 반복문  (0) 2018.01.21
[PL/SQL] IF문 / CASE문  (1) 2018.01.21
[PL/SQL] PL/SQL 기초  (0) 2018.01.17
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] 예외처리 (1) : 예외처리란?
    • [PL/SQL] 프로시저(PROCEDURE)
    • [PL/SQL] 반복문
    • [PL/SQL] IF문 / CASE문
    1HOON
    1HOON

    티스토리툴바