이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 36.13. 사용자 정의 토토 캔버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

33.10. 사용자 정의 토토 커뮤니티

설명대로PostgreSQL : 문서 : 7.4 : PostgreSQL 메이저 토토 사이트 시스템, PostgreSQL할 수 있습니다 새로운 데이터 토토 커뮤니티을 지원하도록 확장되었습니다. 이 섹션에서는 방법을 설명합니다 아래 정의 된 데이터 토토 커뮤니티 인 새 기본 토토 커뮤니티을 정의합니다. 레벨SQL언어. 새로운 기본 토토 커뮤니티을 만들려면 기능을 구현해야합니다 저수준 언어로 토토 커뮤니티에서 작동합니다. 일반적으로 C

이 섹션의 예는에서 찾을 수 있습니다.complex.sqlandcomplex.cinSRC/Tutorial소스의 디렉토리 분포. 참조readme파일 예제 실행에 대한 지침을위한 해당 디렉토리.

사용자 정의 토토 커뮤니티에는 항상 입력이 있어야합니다 출력 기능.이 함수는 방법을 결정합니다 유형은 문자열에 나타납니다 (사용자가 입력하고 사용자) 및 유형이 메모리에서 구성되는 방법. 입력 함수 무효가 종결 된 문자열을 인수로 취합니다 유형의 내부 (메모리) 표현을 반환합니다. 그만큼 출력 함수는 유형의 내부 표현을 다음과 같이합니다. 인수와 널리 터진 문자열을 반환합니다. 우리가 단순히 저장하는 것보다 유형으로 더 많은 일을하고 싶습니다. 무엇이든 구현하기 위해 추가 기능을 제공해야합니다 유형에 대해 갖고 싶은 작업.

우리가 토토 커뮤니티을 정의하고 싶다고 가정복잡한이것은 복소수를 나타냅니다. a를 대표하는 자연스러운 방법 메모리의 복소수는 다음 C 구조입니다.

typedef struct complex 
    더블 X;
    이중 Y;
 복잡한;

우리는 이것을 통과하는 토토 커뮤니티으로 만들어야합니다. 너무 큰 싱글Datumvalue.

토토 커뮤니티의 외부 문자열 표현으로서 우리는 양식의 문자열(x, y).

입력 및 출력 함수는 일반적으로 쓰기가 어렵지 않습니다. 특히 출력 기능. 그러나 외부를 정의 할 때 토토 커뮤니티의 문자열 표현은 당신이해야한다는 것을 기억하십시오 결국에는 완전하고 강력한 파서를 작성하십시오 입력 함수로서의 표현. 예를 들어:

pg_function_info_v1 (complex_in);

자료
complex_in (pg_function_args)

    char *str = pg_getarg_cstring (0);
    더블 X,
                와이;
    복잡한 *결과;

    if (sscanf (str, "( %lf, %lf)", & x, & y)! = 2)
        Ereport (오류,
                (errcode (errcode_invalid_text_representation),
                 errmsg ( "복합체에 대한 잘못된 입력 구문 : \"%s \ "",
                        str));

    결과 = (복합 *) palloc (sizeof (complex));
    결과- x = x;
    결과- y = y;
    pg_return_pointer (결과);

출력 함수는 단순히 다음과 같습니다.

pg_function_info_v1 (complex_out);

자료
complex_out (pg_function_args)

    complex *complex = (복합체 *) pg_getarg_pointer (0);
    char *결과;

    결과 = (char *) palloc (100);
    snprintf (결과, 100, "(%g,%g)", complex- x, complex- y);
    pg_return_cstring (결과);

입력 및 출력 함수를 조심해야합니다. 서로의 역전. 그렇지 않다면, 당신은 심각하게 될 것입니다 데이터를 파일에 덤프해야 할 때 문제가 발생한 다음 다시 읽으십시오. 이것은 특히 일반적인 문제입니다. 부동 소수점 숫자가 관련되어 있습니다.

선택적으로, 사용자 정의 토토 커뮤니티은 이진 입력을 제공 할 수 있습니다 출력 루틴. 이진 I/O는 일반적으로 더 빠르지 만 휴대성이 떨어집니다 텍스트 I/O보다. 텍스트 I/O와 마찬가지로 정의하는 것은 귀하에게 달려 있습니다. 외부 바이너리 표현이 정확히 무엇인지. 대부분의 내장 데이터 토토 커뮤니티은 기계 독립적 이진을 제공하려고합니다 대표. 을 위한복잡한, 우리는 토토 커뮤니티 용 바이너리 I/O 변환기의 돼지백float8:

pg_function_info_v1 (complex_recv);

자료
complex_recv (pg_function_args)

    StringInfo buf = (stringInfo) pg_getarg_pointer (0);
    복잡한 *결과;

    결과 = (복합 *) palloc (sizeof (complex));
    결과- x = pq_getmsgfloat8 (buf);
    결과- y = pq_getmsgfloat8 (buf);
    pg_return_pointer (결과);

pg_function_info_v1 (complex_send);

자료
complex_send (pg_function_args)

    complex *complex = (복합체 *) pg_getarg_pointer (0);
    StringInfodata buf;

    pq_begintypsend (& buf);
    pq_sendfloat8 (& buf, complex- x);
    pq_sendfloat8 (& buf, complex- y);
    pg_return_bytea_p (pq_endtypsend (& buf));

정의하려면복잡한타이핑해야합니다 작성하기 전에 사용자 정의 I/O 함수를 만듭니다 토토 커뮤니티:

함수 complex_in (cstring) 생성
    복잡한 반환
    처럼 'filename'
    언어 C 불변의 엄격;

함수 만들기 complex_out (complex)
    cstring을 반환합니다
    처럼 'filename'
    언어 C 불변의 엄격;

함수 만들기 complex_recv (내부)
   복잡한 반환
   처럼 'filename'
   언어 C 불변의 엄격;

함수 만들기 complex_send (complex)
   Bytea를 반환합니다
   처럼 'filename'
   언어 c 불변의 엄격한;

입력 및 출력 기능의 선언이 있음을 알 수 있습니다. 정의되지 않은 토토 커뮤니티을 참조해야합니다. 이것은 허용되지만 무시할 수있는 경고 메시지를 그립니다. 입력 기능은 먼저 나타나야합니다.

마지막으로 데이터 토토 커뮤니티을 선언 할 수 있습니다 :

토토 커뮤니티 생성 단지 (
   내부 길이 = 16, 
   입력 = complex_in,
   출력 = complex_out,
   수신 = complex_recv,
   send = complex_send,
   정렬 = 이중
);

새 기본 토토 커뮤니티을 정의 할 때PostgreSQL자동으로 지원을 제공합니다 해당 토토 커뮤니티의 배열의 경우역사적 이유, 배열 토토 커뮤니티은 기본과 동일한 이름을 갖습니다. 밑줄 문자로 입력하십시오 (_) 선불.

데이터 유형이 존재하면 추가 기능을 선언 할 수 있습니다. 데이터 유형에 유용한 작업을 제공합니다. 운영자는 할 수 있습니다 함수 위에 정의되고 필요한 경우 운영자 클래스 데이터 유형의 인덱싱을 지원하도록 만들 수 있습니다. 이것들 추가 레이어는 다음 섹션에서 논의됩니다.

데이터 토토 커뮤니티의 값이 수백을 초과하는 경우 바이트 크기 (내부 형태), 데이터 토토 커뮤니티을 만들어야합니다. 토스트 가능.이를 수행하려면 내부 표현은 표준 레이아웃을 따라야합니다 가변 길이 데이터 : 처음 4 바이트는이어야합니다.int32의 바이트의 총 길이를 포함합니다 데이텀 (자체 포함). C는 데이터에서 작동하는 기능입니다 토토 커뮤니티은 건전한 구운 값을 풀려면주의해야합니다. (이 세부 사항은 일반적으로에 숨겨 질 수 있습니다getarg매크로). 그런 다음 실행할 때토토 커뮤니티 생성명령을 지정하십시오 내부 길이 asvariable및 선택 적절한 스토리지 옵션.

자세한 내용은 설명을 참조하십시오.PostgreSQL :명령.