앞에서 언급했듯이 두 가지 종류의 무지개 토토이 있습니다.Postgres: 기본 무지개 토토 (정의 프로그래밍 언어) 및 복합 무지개 토토. 이것의 예 인터페이스 지수까지 섹션을 찾을 수 있습니다.complex.sql및complex.c. 복합 예제가funcs.sql.
사용자 정의 유형은 항상 입력 및 출력이 있어야합니다 기능. 이러한 기능은 유형이 어떻게 나타나는지 결정합니다 문자열 (사용자의 입력 및 사용자에 대한 출력) 및 유형이 메모리에서 구성되는 방법. 입력 함수가 사용됩니다 입력으로 널 지정된 문자열 문자열 유형의 내부 (메모리) 표현. 그만큼 출력 기능은 유형의 내부 표현을 취합니다 널 구분 된 문자열을 반환합니다. 우리를 가정 해 봅시다 복잡한 복잡한 유형을 정의하고 싶습니다 숫자. 당연히, 우리는 단지를 대표하기로 선택합니다 다음과 같은 메모리C구조 :
typedef struct complex 더블 X; 이중 Y; 복잡한;그리고 외부 문자열로 양식 (x, y)의 문자열 (x, y) 문자열 대표. 이러한 기능은 일반적으로 쓰기가 어렵지 않습니다. 특히 출력 기능. 그러나 여러 가지가 있습니다 기억해야 할 사항 :
외부 (문자열) 표현을 정의 할 때, 결국 완전한 글을 써야한다는 것을 기억하십시오 입력으로서의 표현에 대한 강력한 파서 기능!
복잡한 * complex_in (char *str) 더블 X, y; 복잡한 *결과; if (sscanf (str, "( %lf, %lf)", & x, & y)! = 2) elog (오류, "complex_in : parsing %s의 오류", str); 널 리턴; 결과 = (복합 *) palloc (sizeof (complex)); 결과- x = x; 결과- y = y; 반환 (결과);출력 함수는 단순히 다음과 같습니다.
char * complex_out (complex *complex) char *결과; if (complex == null) 반환 (null); 결과 = (char *) palloc (60); sprintf (결과, "(%g,%g)", 복합체- x, 복합- y); 반환 (결과);
입력 및 출력 함수를 만들어야합니다. 서로의 역전. 그렇지 않다면, 당신은 가질 것입니다 데이터를 덤프해야 할 때 심각한 문제 파일을 파일하고 다시 읽으십시오 (예 : 다른 사람의 다른 컴퓨터의 데이터베이스). 이것은 특히입니다 플로팅 포인트 숫자 일 때 일반적인 문제 관련된.
정의하려면복잡한타입, 두 개의 사용자 정의 함수 complex_in을 만들어야합니다 그리고 무지개 토토을 만들기 전에 complex_out :
함수 만들기 complex_in (opaque) 복잡한 반환 'pgroot/튜토리얼/obj/complex.so'로 언어 'c'; 함수 만들기 complex_out (opaque) 불투명 한 반환 'pgroot/튜토리얼/obj/complex.so'로 언어 'c'; 유형 complex 생성 ( 내부 길이 = 16, 입력 = complex_in, 출력 = complex_out );
앞에서 논의 된대로Postgres베이스 배열을 완전히 지원합니다 유형. 또한,Postgres사용자 정의 배열을 지원합니다 유형도. 유형을 정의 할 때Postgres자동으로 지원을 제공합니다 해당 유형의 배열의 경우. 역사적 이유로 배열 유형은 사용자 정의 유형과 동일한 이름입니다. 밑줄 문자 _ Prepended. 복합 유형은 필요하지 않습니다 이미 시스템 이후로 정의 된 기능 그들이 내부에서 어떻게 생겼는지 이해합니다.
데이터 무지개 토토의 값이 수백을 초과하는 경우 크기의 바이트 (내부 형태), 당신은 토스트 가능하게 표시하십시오. 이를 위해 내부 표현 가변 길이 데이터의 표준 레이아웃을 따라야합니다 처음 4 바이트는 총 길이를 포함하는 int32 여야합니다. 데이텀의 바이트 (자체 포함). 그럼, 당신의 모든 무지개 토토의 값을 수락하는 함수는 제공된 값에 대해 PG_DETOAST_DATUM ()을 호출하십시오 함수가 아닌 경우 값이 Null이 아닌지 확인합니다. 엄격한. 마지막으로 적절한 스토리지 옵션을 선택하십시오 생성 무지개 토토 제공 명령 제공.