사용자 정의 함수를 사용할 때 중요한 제약 사항은 해당 함수가 반드시 결정적 함수여야 한다는 점이다(‘1장. 데이터 모델 설계’의 ‘결정적 함수와 비결정적 함수’를 참고한다). 예를 들어 함수에서는 직접적이든 간접적이든 현재 시간을 참조하는 함수를 인덱스로 만드는 것은 불가능하다. 나이에 따라 임직원 정보를 추출한다고 할 때, 코드 2-29와 같은 함수를 생성할 것이다. 여기서는 현재 일자(SYSDATE)와 임직원의 출생연도를 사용해 나이를 계산한다.
코드 2-29 비결정적 함수
CREATE FUNCTION CalculateAge(Date_of_Birth DATE)
RETURNS NUMBER
AS
BEGIN
RETURN
TRUNC((SYSDATE - Date_of_Birth) / 365);
END
Note ≣
코드 2-29의 CalculateAge() 함수는 오라클에서만 작동한다. SQL Server에서는 DATEDIFF(“d”, Date_Of_Birth, Date) / 365를 사용해야 한다. DB2에서는 TRUNC((DAYS(CURRENT_DATE) - DAYS(Date_of_Birth)) / 365, 0)으로 사용해야 하고, MySQL에서는 TRUNCATE(DATEDIFF(SYSDATE(), Date_of_Birth) / 365, 0)으로 사용해야 한다. 액세스는 SQL로 함수를 생성할 수 없고 대신 VBA를 사용해야 한다. 이 함수는 나이를 올바르게 계산하지 못한다는 점에 유의하자. CASE를 사용해 제대로 계산하는 예제는 ‘BETTER WAY 24. CASE로 문제를 해결해야 할 때를 파악하자’를 참고한다.