1. Function Scalar Subquery 변경
ㅇ 서브쿼리의 위치에 따른 명칭
- SELECT문에 있는 서브쿼리 : 스칼라 서브쿼리
- FROM절에 있는 서브쿼리 : 인라인 뷰
- WHERE절에 있는 서브쿼리 : 서브쿼리
ㅇ 스칼라 서브쿼리(Scala Subquery)
- SELECT문에서 사용하는 서브쿼리로 1행만 반환
-- 1. 수정 전
SELECT PRODUCT_CD,
PRODUCT_NAME,
SUM(GET_AVG_STOCK(PRODUCT_CD, :B1, :B2)) AVG_STOCK
FROM PRODUCT
WHERE CATEGORY_CD = ’20’
GROUP BY PRODUCT_CD,
PRODUCT_NAME
-- 2. 수정 후(스칼라 서브쿼리 적용)
SELECT PRODUCT_CD,
PRODUCT_NAME,
SUM((SELECT GET_AVG_STOCK(PRODUCT_CD, :B1, :B2)
FROM DUAL)) AVG_STOCK
FROM PRODUCT
WHERE CATEGORY_CD = ’20’
GROUP BY PRODUCT_CD,
PRODUCT_NAME
;
2. Deterministic Function 사용
입력값이 동일하면 리턴값도 받드시 동일한 함수에서 사용할 수 있는데 이점을 이용해서
함수가 반복 호출될때 이전에 호출한 값이 호출되면 함수가 호출되지 않고
바로 값을 되돌려 줘서 함수호출 부하를 줄이는 것이다.
- Deterministic 키워드는, 함수의 입력 값이 같다면 출력값도 항상 같음을 선언하려는 데 목적이 있다.
- 이러한 본래 의미를 무시하고 캐싱 효과를 얻을 목적으로 함부로 Deterministic 함수로 선언하면 안된다.
Good
Bad
CREATE OR REPLACE FUNCTION f1 (
p1 NUMBER
) RETURN NUMBER DETERMINISTIC
IS
BEGIN
RETURN p1 * 2;
END;
/
CREATE OR REPLACE FUNCTION lookup (
l_input NUMBER
) RETURN VARCHAR2 DETERMINISTIC
IS
BEGIN
select value into l_output from LookupTable where key = l_input;
END;
/