❗함수(User Defined Function : Function)
- 특징은 procedure와 유사하며, 반환 값이 존재함
- 보통 OUT 매개변수는 사용하지 않음
(사용형식)
CREATE [OR REPLACE] PROCEDURE 프로시져명[(
매개변수 [IN|OUT|INOUT] 데이터타입[:=디폴트 값],
:
매개변수 [IN|OUT|INOUT] 데이터타입[:=디폴트 값])
RETURN 데이터타입 -- 세미콜론(;) 없음
IS|AS
선언영역
BEGIN
실행영역
(반드시 하나이상의
RETURN expr; 이 존재해야 함) --SELECT문의 SELECT절이나 WHERE절에서 사용, 동일한 데이터타입을 사용해야 함
END;
. 하나의 함수는 하나의 값만 반환 가능
. 함수의 호출을 SELECT문의 SELECT절, WHERE절 등에서 수행
✔ 사용예) 회원번호를 입력받아 2020년 7월 구매현황을 조회하시오.
CREATE OR REPLACE FUNCTION fn_sum_member(
p_mid IN MEMBER.MEM_ID%TYPE)
RETURN NUMBER --;x
IS
L_SUM NUMBER:=0; --구매금액을 계산해서 보관할 방, 값이없으면 NULL
BEGIN
SELECT SUM(A.CART_QTY*B.PROD_PRICE) INTO L_SUM
FROM CART A, PROD B
WHERE A.CART_PROD=B.PROD_ID
AND A.CART_MEMBER=p_mid
AND A.CART_NO LIKE '202007%';
RETURN L_SUM;
END;
[실행]
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
NVL(fn_sum_member(MEM_ID),0) AS 구매금액
FROM MEMBER
WHERE MEM_ID IN(SELECT CART_MEMBER
FROM CART
WHERE CART_NO LIKE '202007%');
-- => OUTER JOIN 결과
✔사용예) 장바구니테이블에 매출정보를 저장하는 프로시져를 작성하시오
입력자료는 회원번호,회원명,날짜,상품번호,수량이며 장바구니번호는 함수를 이용하여
작성하시오
CREATE OR REPLACE PROCEDURE insert_cart_proc(
p_mid IN MEMBER.MEM_ID%TYPE,
p_date IN DATE,
p_pid IN PROD.PROD_ID%TYPE,
p_qty IN NUMBER)
IS
BEGIN
INSERT INTO CART VALUES(p_mid,create_cart_no(p_date,p_mid),p_pid,p_qty);
COMMIT;
END;
--장바구니번호 생성 함수
CREATE OR REPLACE FUNCTION create_cart_no(
p_date IN DATE, p_mid IN MEMBER.MEM_ID%TYPE)
RETURN CHAR
IS
L_CART_NO CART.CART_NO%TYPE; --장바구니번호 잠시보관
L_MID MEMBER.MEM_ID%TYPE;
L_COUNT NUMBER:=0; --행의수
L_FLAG CHAR(9):=TO_CHAR(p_date,'YYYYMMDD')||'%';
BEGIN
--해당일자의 장바구니테이블에 자료존재 판단
SELECT COUNT(*) INTO L_COUNT
FROM CART
WHERE CART_NO LIKE L_FLAG;
IF L_COUNT=0 THEN -- 첫 고객
L_CART_NO:=TO_CHAR(p_date,'YYYYMMDD')||TRIM('00001');
ELSE
--해당 날짜의 최대장바구니번호
SELECT MAX(CART_NO) INTO L_CART_NO
FROM CART
WHERE CART_NO LIKE L_FLAG;
-- 최대장바구니 번호를 보유한 회원번호
SELECT DISTINCT CART_MEMBER INTO L_MID
FROM CART
WHERE CART_NO = L_CART_NO;
IF L_MID!=p_mid THEN
L_CART_NO:=L_CART_NO+1;
END IF;
END IF;
RETURN L_CART_NO;
END;
SELECT create_cart_no(TO_DATE('20200414'),'f001')
FROM DUAL;
/*
p_mid IN MEMBER.MEM_ID%TYPE,
p_date IN DATE,
p_pid IN PROD.PROD_ID%TYPE,
p_qty IN NUMBER)
*/
EXECUTE insert_cart_proc('b001',SYSDATE,'P201000010',5);
EXECUTE insert_cart_proc('b001',SYSDATE,'P302000016',10);
EXECUTE insert_cart_proc('t001',SYSDATE,'P101000003',2);
DELETE FROM CART WHERE CART_NO LIKE '2022%';
COMMIT;
'ORACLE 복습 & 정리' 카테고리의 다른 글
[ORACLE] 패키지 221202-03 (0) | 2022.12.02 |
---|---|
[ORACLE] 트리거 221202-02 (0) | 2022.12.02 |
[ORACLE] 저장프로시져 221201-04 (1) | 2022.12.01 |
[ORACLE] 반복문 221201-03 (0) | 2022.12.01 |
[ORACLE] 분기명령 221201-02 (0) | 2022.12.01 |