한번도 사용해 본 적이 없었지만 왠지 쉽게 될 것 같아 만들어 보려했지만 생각처럼 되지는 않더군요
예를 들어 다음과 같이 사용하고 싶은 거였죠
SELECT UserFunction() FROM DUAL;
SELECT UserFunction('ERITAKA') FROM DUAL;
SELECT UserFunction('ERITAKA', '.NET') FROM DUAL;
그런데 이게 함수만 만들어 바로 사용하는 건 불가능했습니다.
즉, Package 로 감싸지 않는 이상은 오버로딩이 불가능했습니다.
그래서 다음과 같이 Package를 만들고 함수를 추가했습니다.
CREATE OR REPLACE PACKAGE Eritaka AS FUNCTION UserFunction RETURN VARCHAR2; FUNCTION UserFunction(p_field IN VARCHAR2) RETURN VARCHAR2; FUNCTION UserFunction(p_field IN VARCHAR2, p_field2 IN VARCHAR2) RETURN VARCHAR2; FUNCTION UserFunction(p_field IN NUMBER) RETURN VARCHAR2; END;
그런 후에 아래와 같이 Package의 Body를 만들어 줍니다.
CREATE OR REPLACE PACKAGE BODY Eritaka AS
FUNCTION UserFunction RETURN VARCHAR2
IS
BEGIN
RETURN 'Eritaka';
END;
FUNCTION UserFunction(p_field IN VARCHAR2) RETURN VARCHAR2
IS
BEGIN
RETURN to_char(p_field);
END;
FUNCTION UserFunction(p_field IN VARCHAR2, p_field2 IN VARCHAR2) RETURN VARCHAR2
IS
BEGIN
RETURN to_char(p_field || p_field2);
END;
FUNCTION UserFunction(p_field IN NUMBER) RETURN VARCHAR2
IS
BEGIN
RETURN UserFunction() || to_char(p_field);
END;
END;SELECT Eritaka.UserFunction() FROM dual;
SELECT Eritaka.UserFunction('eritaka') FROM dual;
SELECT Eritaka.UserFunction('eritaka', '.net') FROM dual;
SELECT Eritaka.UserFunction(3) FROM dual;
결과는 뭐 아래와 같습니다.
Eritaka eritaka eritaka.net Eritaka3
그러면 이제 처음 목적과는 조금 다르게 Package를 꼭 서두에 붙여야 사용가능하다는게 문제입니다.
사실 이 부분을 해결하기 위해서는 Synonym 을 생성하면 되겠다. 라고 간단히 생각했는데... 안되더군요. oTL
즉, 아래처럼 하면 될거라고 무심코 생각해버렸었다는.. ㅠ.ㅠ
Create Public Synonym UserFunction for Eritaka.UserFunction;
아참 MS-SQL 의 T-SQL 에서는 오버로딩이 안되는 것 같습니다.
요새 느끼는 거지만 오라클을 사용하다 씨퀄을 사용하면 왜 이렇게 불편한 점이 많은지...



