Postgresql 9.3.25 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.3 : 사용자 정의 토토 캔 | Postgre토토 사이트 추천 : 문서 : 9.3 : 토토 사이트 추천 확장 | 35 장. 확장SQL | 다음 |
설명대로PostgreSQL : 문서 : 9.3 : PostgreSQL 스포츠 토토 베트맨 시스템, PostgreSQL할 수 있습니다 새로운 데이터 스포츠 토토 베트맨을 지원하도록 확장되었습니다. 이 섹션에서는 방법을 설명합니다 레벨 아래에 정의 된 데이터 스포츠 토토 베트맨 인 새 기본 스포츠 토토 베트맨 정의 의SQL언어. a 새로운 기본 스포츠 토토 베트맨은 낮은 수준의 언어를 입력하십시오. 일반적으로 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 함수를 작성하고 그것들을 공유 라이브러리, 우리는를 정의 할 수 있습니다.복잡한SQL 입력. 먼저 우리는 그것을 쉘 유형으로 선언합니다 :
스포츠 토토 베트맨 생성 단지;
이것은 우리가 참조 할 수있는 자리 표시 자 역할을합니다. I/O 함수를 정의하는 동안 입력하십시오. 이제 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자동으로 지원을 제공합니다 해당 스포츠 토토 베트맨의 배열. 배열 스포츠 토토 베트맨은 일반적으로 이름과 동일합니다 밑줄 문자가있는 기본 스포츠 토토 베트맨 (_) Prefended.
데이터 유형이 존재하면 추가 기능을 선언 할 수 있습니다. 데이터 유형에 유용한 작업을 제공합니다. 운영자는 할 수 있습니다 함수 위에 정의되며 필요한 경우 운영자 클래스는 데이터 유형의 인덱싱을 지원하기 위해 생성됩니다. 이 추가 레이어는 다음 섹션에서 논의됩니다.
데이터 스포츠 토토 베트맨의 값이 크기가 다르면 (내부 형식), 데이터 스포츠 토토 베트맨을 만들어야토스트-abable (참조섹션 58.2). 당신은 이렇게해야하더라도 이것을해야합니다 데이터는 항상 너무 작아서 압축되거나 저장됩니다. 외부, 왜냐하면토스트can 헤더 오버 헤드를 줄임으로써 작은 데이터에도 공간을 절약하십시오.
이렇게하려면 내부 표현은 표준을 따라야합니다.
가변 길이 데이터의 레이아웃 : 처음 4 바이트는이어야합니다.char [4]결코 액세스하지 않은 필드
직접 (관습 적으로 명명 된VL_LEN_).
사용해야합니다set_varsize ()
저장
이 필드에서 데이텀의 크기와varsize ()
검색하려면. C 기능
데이터 스포츠 토토 베트맨에서 작동하는 것은 항상 포장을 풀려면 조심해야합니다.
구운 값을 사용하여PG_DETOAST_DATUM
. (이 세부 사항은 관례 적으로입니다
스포츠 토토 베트맨 특이 적 정의로 숨겨져 있음getarg_datatype_p
Macros.) 그런 다음를 실행할 때스포츠 토토 베트맨 만들기명령, 내부를 지정하십시오
길이 asvariable를 선택하십시오
적절한 저장 옵션.
정렬이 중요하지 않은 경우 (단지 특정 용도
기능 또는 데이터 유형이 어쨌든 바이트 정렬을 지정하기 때문에)
그런 다음의 일부 오버 헤드를 피할 수 있습니다.PG_DETOAST_DATUM
. 사용할 수 있습니다pg_detoast_datum_packed
대신 (관습 적으로
a를 정의하여 숨겨getarg_datatype_pp
매크로) 및 매크로 사용varsize_any_exhdr
andvardata_any
잠재적으로 포장 된 데이텀에 액세스하려면.
다시,이 매크로에 의해 반환 된 데이터는
데이터 스포츠 토토 베트맨 정의 정렬을 지정합니다. 정렬이있는 경우
중요한 것은 정기적 인 것을 겪어야한다PG_DETOAST_DATUM
인터페이스.
참고 :이전 코드가 자주 선언VL_LEN_ASint32필드 대신char [4]. 이것은 오랫동안 괜찮습니다 Struct 정의에는 적어도 다른 필드가 있습니다int32정렬. 그러나 그러한 것을 사용하는 것은 위험합니다 잠재적으로 정렬되지 않은 데이텀으로 작업 할 때 구조 정의; 컴파일러는 데이텀이 실제로 정렬되어 엄격한 아키텍처의 핵심 덤프로 이어집니다. 정렬에 대해.
자세한 내용은 설명을 참조하십시오.스포츠 토토 베트맨 만들기Command.