중복 할인 함수를 생성해보자. 퀴즈로 배우는 SQL : 중복 할인 금액 구하기 글에서 아이디어를 얻었다.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (seq NUMBER, amt NUMBER, rat NUMBER); INSERT INTO t1 VALUES (1, 2000, NULL); INSERT INTO t1 VALUES (2, NULL, 10); INSERT INTO t1 VALUES (3, 3000, NULL); INSERT INTO t1 VALUES (4, NULL, 20); COMMIT;
아래와 같이 중복 할인 함수를 생성하자. 두 번째 인수로 커서를 입력받는다.
-- 2 CREATE OR REPLACE FUNCTION fn_discount ( i_prc IN NUMBER , i_cur IN SYS_REFCURSOR ) RETURN NUMBER IS l_amt NUMBER; l_rat NUMBER; l_ret NUMBER := i_prc; BEGIN LOOP FETCH i_cur INTO l_amt, l_rat; EXIT WHEN i_cur%NOTFOUND; CASE WHEN l_amt IS NOT NULL THEN l_ret := l_ret - l_amt; WHEN l_rat IS NOT NULL THEN l_ret := l_ret - (l_ret * (l_rat / 100)); ELSE NULL; END CASE; END LOOP; CLOSE i_cur; RETURN l_ret; END fn_discount; /
아래 쿼리로 중복 할인된 금액을 구할 수 있다.
-- 3 SELECT fn_discount (20000, CURSOR (SELECT amt, rat FROM t1 ORDER BY seq)) AS rem FROM DUAL; REM ----- 10560 1개의 행이 선택되었습니다.
'Oracle > PL/SQL' 카테고리의 다른 글
가변 IN 조건 값 처리 #2 - 임시 테이블 (0) | 2018.11.03 |
---|---|
가변 IN 조건 값 처리 #1 - PIPELINED 함수 (0) | 2018.11.03 |
동적 순위 부여 (0) | 2014.04.23 |
DBMS_UTILITY.EXPAND_SQL_TEXT 프로시저 (0) | 2014.04.19 |
REFERENCE CURSOR 예제 (0) | 2013.09.01 |