User Defined Function : Function

조수경·2021년 10월 28일
0

Oracle

목록 보기
19/19

User Defined Function : Function

  • 프로시져와 유사한 구조

  • 반환 값이 존재 --프로시져와 반대

  • 일반 내장함수처럼 사용

    (사용형식)
    CREATE [OR REPLACE] FUNCTION 함수명
    변수명 모드 타입명[:=|DEFAULT 값,]
    : : : : : : : :
    변수명 모드 타입명[:=|DEFAULT 값])]
    RETURN 타입명 --세미콜론이 없음

     IS|AS   
        선언부
    BEGIN   
        실행부
          RETURN expr;   --반드시 변수 상수 수식이 나와야 함 끝인 RETURN 으로 결과값을 호출한 쪽에 돌려 줌;;;;
          
         [EXCEPTION
           예외처리;
           ]
     END;

    사용예) 사원번호를 입력 받아 부서내에서 입사순번을 출력하는 함수--형태가 달라짐 반환되는 값이 두개라면 변수 하나에 반환값 두개를 합쳐야함.

         (함수)
           CREATE OR REPLACE FUNCTION FN_EMP_HIRE_DATE(
                P_EID IN HR.EMP.EMPLOYEE_ID%TYPE)
                RETURN NUMBER --넘버는 숫자로 반환 타입
           IS
             V_ORDER_NUM NUMBER:=0;   -- 입사순번  반환될 데이터를 얘가 가지고 있을 것임.
           BEGIN
             SELECT A.ONUM INTO V_ORDER_NUM
               FROM (SELECT DEPARTMENT_ID AS DID,  --서브쿼리는 부서번소 사원번호에 따른 입사순번이 나오고 메인쿼리에선 사원번호가 같은 사람을 찾아서 입사순번 V_ORDER_NUM 으로 반환
                            EMPLOYEE_ID AS EID,
                            RANK() OVER(PARTITION BY DEPARTMENT_ID  -- 파티션 바이 뒤에 있는 컬럼으로 그룹을 만들어서 입사순번이 그룹 내에서 몇번 째인지를 순위매김
                                        ORDER BY HIRE_DATE ASC) AS ONUM
                       FROM HR.EMP) A
              WHERE A.EID = P_EID;
              RETURN V_ORDER_NUM;
           END;
    
        
        (실행)
          SELECT A.EMPLOYEE_ID AS 사원번호,
                 A.EMP_NAME AS 사원명,
                 B.DEPARTMENT_NAME AS 부서명,
                 FN_EMP_HIRE_DATE(A.EMPLOYEE_ID) AS 입사순번
            FROM HR.EMP A, HR.DEPT B
           WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
           ORDER BY 3,4;

    / 주문상품 /
    CREATE TABLE order_goods (
    prod_id char(6) NOT NULL, / 상품번호 /
    order_id NUMBER(10) NOT NULL, / 주문번호 /
    order_qty NUMBER(4) / 수량 /
    );

ALTER TABLE order_goods
ADD
CONSTRAINT PK_order_goods
PRIMARY KEY (
prod_id,
order_id
);

/ 고객 /
CREATE TABLE customer (
cust_id CHAR(5) NOT NULL, / 고객번호 /
cost_name VARCHAR(30), / 고객명 /
cost_addr VARCHAR2(100) / 주소 /
);

ALTER TABLE customer
ADD
CONSTRAINT PK_customer
PRIMARY KEY (
cust_id
);

/ 상품 /
CREATE TABLE goods (
prod_id char(6) NOT NULL, / 상품번호 /
prod_name VARCHAR2(30) NOT NULL, / 상품명 /
prod_price NUMBER(7) DEFAULT 0 / 단가 /
);

ALTER TABLE goods
ADD
CONSTRAINT PK_goods
PRIMARY KEY (
prod_id
);

/ 주문 /
CREATE TABLE order (
order_id NUMBER(10) NOT NULL, / 주문번호 /
order_date DATE DEFAULT sysdate, / 주문일자 /
order_amt number(8) DEFAULT 0, / 금액 /
cust_id CHAR(5) / 고객번호 /
);

ALTER TABLE order
ADD
CONSTRAINT PK_order
PRIMARY KEY (
order_id
);

ALTER TABLE order_goods
ADD
CONSTRAINT FK_goods_TO_order_goods
FOREIGN KEY (
prod_id
)
REFERENCES goods (
prod_id
);

ALTER TABLE order_goods
ADD
CONSTRAINT FK_order_TO_order_goods
FOREIGN KEY (
order_id
)
REFERENCES order (
order_id
);

ALTER TABLE order
ADD
CONSTRAINT FK_customer_TO_order
FOREIGN KEY (
cust_id
)
REFERENCES customer (
cust_id
);

    DROP TABLE CUSTOMER;
            DROP TABLE GOODS;
                    DROP TABLE ORDER_GOODS;
                 
profile
신입 개발자 입니다!!!

0개의 댓글