앞에서 언급했듯이 두 가지 종류의 토토 베이이 있습니다.PostgreSQL: 기본 토토 베이 (정의 프로그래밍 언어) 및 복합 토토 베이. 이 장 새로운 기본 토토 베이을 정의하는 방법을 설명합니다.
이 섹션의 예는에서 찾을 수 있습니다.complex.sqlandcomplex.c튜토리얼 디렉토리의. 합성물 예제는funcs.sql.
사용자 정의 토토 베이에는 항상 입력이 있어야합니다 출력 기능. 이러한 기능은 토토 베이이 어떻게 나타나는지 결정합니다 문자열 (사용자의 입력 및 사용자에 대한 출력) 및 토토 베이은 메모리로 구성됩니다. 입력 함수는 a를 취합니다 입력으로 Null-Terminated 캐릭터 문자열을 입력하고 반환합니다 토토 베이의 내부 (메모리) 표현. 출력 함수는 토토 베이의 내부 표현을 취합니다 무효 문자 문자열을 반환합니다.
우리가 나타내는 복잡한 유형을 정의하고 싶다고 가정합니다. 복소수. 당연히 우리는 a를 대표하도록 선택할 것입니다 다음과 같은 메모리가 복잡합니다C구조 :
typedef struct complex 더블 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
andcomplex_out
토토 베이을 만들기 전에 :
CREATENT COMPLET_IN (CSTRING) 복잡한 반환 처럼 'pgroot/튜토리얼/복합체 ' 언어 C; 함수 만들기 complex_out (complex) cstring을 반환합니다 처럼 'pgroot/튜토리얼/복합체 ' 언어 C;
마지막으로 데이터 토토 베이을 선언 할 수 있습니다.
유형 Complex ( 내부 길이 = 16, 입력 = complex_in, 출력 = complex_out );
입력 및 출력 기능의 선언이 있음을 알 수 있습니다. 정의되지 않은 토토 베이을 참조해야합니다. 이것은 허용되지만 무시 될 수있는 경고 메시지를 그립니다.
앞에서 논의한대로PostgreSQL배열을 완전히지지합니다 기본 토토 베이의. 또한,PostgreSQL사용자 정의 배열을 지원합니다 토토 베이도. 토토 베이을 정의 할 때PostgreSQL자동으로 지원을 제공합니다 해당 토토 베이의 배열의 경우. 역사적 이유로 배열 토토 베이 밑줄이있는 사용자 정의 토토 베이과 동일한 이름이 있습니다. 성격_Prepended.
복합 토토 베이에 정의 된 기능이 필요하지 않습니다. 시스템은 이미 자신의 모습을 이해하고 있기 때문입니다 내부에.
당신의 값이라면
데이터 토토 베이은 크기가 수백 바이트를 초과 할 수 있습니다 (내부에서
형태), 당신은 그것들을 토스트 가능하게 표시하도록주의해야합니다. 이를 위해
내부 표현은 표준 레이아웃을 따라야합니다
가변 길이 데이터 : 처음 4 바이트는이어야합니다.int32의 바이트의 총 길이를 포함합니다
데이텀 (자체 포함). 그런 다음 받아들이는 모든 기능
유형의 값은 호출을 조심해야합니다pg_detoast_datum ()
제공된 값에 대한 ---
값이 NULL이 아닌지 확인한 후 기능이있는 경우
엄격하지 않습니다. 마지막으로 적절한 스토리지 옵션을 선택하십시오
주는토토 베이 만들기명령.