이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 36.13. 사용자 정의 토토 캔버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

14장. 확장SQL: 무지개 토토

앞서 언급했듯이 두 가지 종류의 무지개 토토이 있습니다.포스트그레: 기본 유형(에 정의됨) 프로그래밍 언어) 및 복합 유형. 이에 대한 예 인터페이스 인덱스까지의 섹션은 다음에서 찾을 수 있습니다.복잡한.sql그리고복잡한.c. 복합 예는 다음과 같습니다.funcs.sql.

14.1. 사용자 정의 무지개 토토

14.1.1. 사용자 정의 무지개 토토에 필요한 기능

사용자 정의 유형에는 항상 입력과 출력이 있어야 합니다. 기능. 이러한 함수는 유형이 표시되는 방식을 결정합니다. 문자열(사용자가 입력하고 사용자에게 출력하기 위한) 및 유형이 메모리에서 어떻게 구성되는지. 입력 기능은 null로 구분된 문자열을 입력으로 사용하고 반환합니다. 유형의 내부(메모리 내) 표현입니다. 는 출력 함수는 유형의 내부 표현을 취합니다. null로 구분된 문자열을 반환합니다. 우리가 복합물을 나타내는 복합 유형을 정의하고 싶습니다. 숫자. 당연히 우리는 콤플렉스를 표현하기로 선택합니다. 메모리는 다음과 같습니다C구조:

typedef 구조체 복합체 
    더블엑스;
    이중 y;
 복잡;
및 외부 문자열인 (x,y) 형식의 문자열 표현. 이러한 함수는 일반적으로 작성하기 어렵지 않습니다. 특히 출력 기능. 그러나 다음과 같은 여러 가지가 있습니다. 기억해야 할 점:
  • 외부(문자열) 표현을 정의할 때, 결국에는 완전한 내용을 작성해야 한다는 점을 기억하세요. 해당 표현을 입력으로 사용하는 강력한 파서 기능!

    복잡함 *
    complex_in(문자 *str)
    
        이중 x, y;
        복잡한 *결과;
        if (sscanf(str, " ( %lf , %lf )", &x, &y) != 2) 
            elog(ERROR, "complex_in: %s 구문 분석 중 오류가 발생했습니다", str);
            NULL을 반환합니다.
    
        결과 = (복소수 *)palloc(sizeof(복소수));
        결과-x = x;
        결과-y = y;
        반환(결과);
    출력 함수는 간단하게 다음과 같습니다:
    문자 *
    complex_out(복잡한 *복잡한)
    
        문자 *결과;
        if (복합 == NULL)
            반환(NULL);
        결과 = (char *) palloc(60);
        sprintf(결과, "(%g,%g)", 복합체-x, 복합체-y);
        반환(결과);
  • 당신은 입력과 출력 기능을 만들도록 노력해야 합니다 서로 반대. 그렇지 않으면 당신은 갖게 될 것입니다. 데이터를 덤프해야 할 때 심각한 문제가 발생합니다. 파일을 저장한 다음 다시 읽습니다(예: 다른 사람의 파일로). 다른 컴퓨터의 데이터베이스). 이는 특히 부동 소수점 숫자가 있을 때 흔히 발생하는 문제 참여했습니다.

정의하려면복잡한무지개 토토, 두 개의 사용자 정의 함수 complex_in을 만들어야 합니다. 무지개 토토을 생성하기 전 및 complex_out:

CREATE FUNCTION complex_in(불투명)
    반품 콤플렉스
    AS 'PGROOT/tutorial/obj/complex.so'
    언어 'ㄷ';

CREATE FUNCTION complex_out(불투명)
    불투명한 반환
    AS 'PGROOT/tutorial/obj/complex.so'
    언어 'ㄷ';

CREATE TYPE 콤플렉스(
    내부 길이 = 16,
    입력 = complex_in,
    출력 = complex_out
);

앞서 논의한 바와 같이,포스트그레기본 배열을 완벽하게 지원합니다. 유형. 추가적으로,포스트그레스사용자 정의 배열을 지원합니다. 종류도 그렇고. 유형을 정의할 때,포스트그레스자동으로 지원 제공 해당 유형의 배열에 대해. 역사적인 이유로 어레이는 유형은 사용자 정의 유형과 이름이 동일합니다. 밑줄 문자 _가 앞에 붙습니다. 복합 유형은 필요하지 않습니다. 시스템이 이미 정의되어 있는 모든 기능 내부가 어떻게 생겼는지 이해합니다.

14.1.2. 대형 객체

당신의 데이터 유형 값이 수백을 초과하는 경우 바이트 크기(내부 형식)에 주의해야 합니다. TOASTable로 표시하세요. 이를 위해 내부 표현 가변 길이 데이터의 표준 레이아웃을 따라야 합니다. 처음 4바이트는 전체 길이를 포함하는 int32여야 합니다. 데이텀(자체 포함)의 바이트 단위입니다. 그러면 당신의 모든 해당 유형의 값을 허용하는 함수는 다음 사항에 주의해야 합니다. 제공된 값에 대해 pg_detoast_datum()을 호출합니다. --- 이후 함수가 NULL이 아닌 경우 값이 NULL이 아닌지 확인 엄격하다. 마지막으로 다음과 같은 경우 적절한 저장 옵션을 선택하세요. CREATE TYPE 명령을 제공합니다.