[PostgreSQL] Function 오버로딩

Ja L·2023년 12월 13일
0

[PostgreSQL] Operation

목록 보기
18/39

Fuction을 공부하며 이것 저것 시도하며 이상한 것을 느꼈습니다.
Fuction을 생성하는 데 매개변수 데이터 타입만 다르면 같은 이름으로 함수를 중복 생성할 수 있었습니다. 따라서 가능한 이유에 대해서 찾아봤습니다.

postgresql 에서 function을 만들 때 매개변수만 다르면 같은 이름으로 function을 만들 수 있습니다. 이유는 무엇인가요?

PostgreSQL에서 함수의 오버로딩(Overloading)을 지원하기 때문에, 같은 이름의 함수를 서로 다른 매개변수로 여러 개 생성할 수 있습니다. 오버로딩은 동일한 이름의 함수가 서로 다른 매개변수 형식을 가질 수 있는 기능입니다.

저의 경우에는 아래와 같은 경우였습니다.
Case1

CREATE OR REPLACE FUNCTION get_tables_in_schema(db_name varchar)
RETURNS TABLE (
    schema_name varchar,
    table_name varchar
) AS
$$
BEGIN
    RETURN QUERY
    SELECT
        t.table_schema::varchar,
        t.table_name::varchar
    FROM
        information_schema.tables t 
    WHERE
        t.table_catalog::varchar = db_name;
END;
$$ LANGUAGE 'plpgsql';

Case2

CREATE OR REPLACE FUNCTION get_tables_in_schema(db_name text)
RETURNS TABLE (
    schema_name text,
    table_name text
) AS
$$
BEGIN
    RETURN QUERY
    SELECT
        t.table_schema::text,
        t.table_name::text
    FROM
        information_schema.tables t 
    WHERE
        t.table_catalog::text = db_name;
END;
$$ LANGUAGE 'plpgsql';

실행

select * from get_tables_in_schema('postgres') ;

위의 두 예시같은 경우 똑같이 텍스트 형식이기때문에 'postgres'라는 값을 매개변수로 줄 경우는 어떻게 될까요?

PostgreSQL에서 함수 오버로딩이 적용되면 매개변수의 자료형(Type)과 길이(Length)는 오버로딩의 일부로 간주되지 않습니다. 따라서 varchar(20)과 text라는 서로 다른 자료형을 갖는 함수가 오버로딩되면, PostgreSQL은 입력 값에 가장 근접한 자료형을 가진 함수를 선택합니다. 함수를 호출할 때 'postgres'라는 값을 전달하면 PostgreSQL은 두 함수 중 어떤 함수를 선택할지를 결정합니다. 이때, text 자료형의 함수가 더 범용적이므로 해당 함수가 선택됩니다. 즉, example_function('postgres') 호출은 text 자료형을 받는 함수가 실행됩니다.

profile
DB Engineer

0개의 댓글

관련 채용 정보