PostgreSQL | ||
---|---|---|
이전 | 31 장. SQL 확장 : 기능 | 다음 |
내부적으로 kèo tỷ số bóng đá euro hôm nay는 기본 유형을 "메모리의 블로브"로 간주합니다. 유형을 차례로 정의하는 사용자 정의 기능 kèo tỷ số bóng đá euro hôm nay가 작동 할 수있는 방식을 정의하십시오. 즉, kèo tỷ số bóng đá euro hôm nay입니다 디스크에서 데이터를 저장하고 검색하고 사용합니다. 데이터를 입력, 프로세스 및 출력 할 수있는 사용자 정의 기능. 베이스 유형은 세 가지 내부 형식 중 하나를 가질 수 있습니다.
통과 별 가치, 고정 길이
참조 별 통과, 고정 길이
참조별로 전달, 가변 길이
바이 값 유형은 길이가 1, 2 또는 4 바이트 일 수 있습니다 ( 컴퓨터는 다른 크기의 가치 유형을 지원합니다). 포스트 그레스 그 자체는 정수 유형 만 가치로 전달합니다. 당신은 조심해야합니다 크기가 같은 크기가되도록 유형을 정의하십시오 (바이트) 모든 아키텍처에서. 예를 들어, 긴 유형은 위험합니다 일부 기계에서는 4 바이트이고 다른 기계의 8 바이트이기 때문에 int 유형은 대부분의 유닉스 머신에서 4 바이트입니다 ( 대부분의 개인용 컴퓨터). INT4의 합리적인 구현 Unix 기계의 유형은 다음과 같습니다.
/ * 4-byte 정수, 가치에 의해 통과 */ typedef int int4;
반면에, 모든 크기의 고정 길이 유형이 전달 될 수 있습니다. 회의 별. 예를 들어 다음은 다음과 같습니다 kèo tỷ số bóng đá euro hôm nay char16 유형 :
/ * 16 바이트 구조, 참조로 통과 */ typedef struct 숯 데이터 [16]; char16;
그러한 유형에 대한 포인터 만 전달할 때 사용할 수 있습니다. 포스트 그레스 기능. 마지막으로 모든 가변 길이 유형이 있어야합니다 또한 참조로 전달됩니다. 모든 가변 길이 유형이 시작되어야합니다 정확히 4 바이트의 길이 필드와 모든 데이터가 저장 될 수 있습니다. 해당 유형 내에서는 즉시 메모리에 위치해야합니다. 그 길이 필드에 따라. 길이 필드는 총 길이입니다 구조 (즉, 길이 필드의 크기를 포함합니다. 그 자체). 텍스트 유형을 다음과 같이 정의 할 수 있습니다.
typedef struct int4 길이; 숯 데이터 [1]; 텍스트;
분명히 데이터 필드는 모든 것을 유지하기에 충분하지 않습니다. 가능한 문자열 - 그러한 구조를 C. 가변 길이 유형을 조작 할 때는주의해야합니다. 올바른 양의 메모리를 할당하고 길이를 초기화합니다. 필드. 예를 들어, 텍스트에 40 바이트를 저장하려면 구조, 우리는 다음과 같은 코드 조각을 사용할 수 있습니다.
#include "kèo tỷ số bóng đá euro hôm nayh" #include "utils/palloc.h" ... 숯 버퍼 [40]; / * 소스 데이터 */ ... 텍스트 *대상 = (텍스트 *) palloc (varhdrsz + 40); 대상- 길이 = varhdrsz + 40; Memmove (대상- 데이터, 버퍼, 40); ...
이제 우리는베이스를위한 가능한 모든 구조를 살펴 보았습니다. 유형, 우리는 실제 기능의 몇 가지 예를 보여줄 수 있습니다. 가정하다funcs.c모양 :
#include <string.h #include "kèo tỷ số bóng đá euro hôm nayh" / * char16 등 * / #include "utils/palloc.h"/ * palloc */ int add_one (int arg) 반환 (arg + 1); char16 * concat16 (char16 *arg1, char16 *arg2) char16 *new_c16 = (char16 *) palloc (sizeof (char16)); memset ((void *) new_c16, 0, sizeof (char16)); (void) strncpy (new_c16, arg1, 16); return (char16 *) (strncat (new_c16, arg2, 16)); 텍스트 * 카피 텍스트 (텍스트 *t) /* * varsize는 바이트의 구조물의 총 크기입니다. */ 텍스트 *new_t = (텍스트 *) palloc (varsize (t)); memset (new_t, 0, varsize (t)); varsize (new_t) = varsize (t); /* * Vardata는 구조물의 데이터 영역에 대한 포인터입니다. */ memcpy ((void *) vardata (new_t), / *대상 * / (void *) vardata (t), / *소스 * / varsize (t) -varhdrsz); / * 얼마나 많은 바이트 */ 반환 (new_t);
OSF/1에서 우리는 다음을 입력합니다 :
함수 생성 add_one (int4)은 int4를 반환합니다 'pgroot/튜토리얼/obj/funcs.so'language 'c'; CONCITE 16 (char16, char16)은 char16을 반환합니다 'pgroot/튜토리얼/obj/funcs.so'language 'c'; 함수 CopyText (텍스트)를 작성합니다 텍스트를 반환합니다 'pgroot/튜토리얼/obj/funcs.so'language 'c'; as
다른 시스템에서는 파일 이름을 .sl에서 끝내야 할 수도 있습니다. (공유 도서관임을 나타 내기 위해).
복합 유형에는 C 구조와 같은 고정 레이아웃이 없습니다. 복합 유형의 인스턴스에는 널 필드가 포함될 수 있습니다. 게다가, 상속 계층의 일부인 복합 유형은 같은 상속의 다른 구성원과는 다른 필드 계층. 따라서 kèo tỷ số bóng đá euro hôm nay는 절차 인터페이스를 제공합니다 C. Composite 유형의 필드에 액세스하는 C. 인스턴스 세트, 각 인스턴스가 기능으로 전달됩니다. 유형 튜플의 불투명 구조로서. 우리가 쓰고 싶다고 가정 해 봅시다 쿼리에 응답하는 기능
* 이름, c_overpaid (EMP, 1500)를 초과 지불로 선택하십시오 emp에서 여기서 name = 'bill'또는 name = 'sam';위의 쿼리에서 c_overpaid를 다음과 같이 정의 할 수 있습니다.
#include "kèo tỷ số bóng đá euro hôm nayh" / * char16 등 * / #include "libpq-fe.h" / * 튜플 * / 부 c_overpaid (tuple t,/ * 현재 emp */ int4 한계) bool isnull = false; int4 급여; 급여 = (int4) getAttributeByName (t, "Salary", & isnull); if (isnull) 반환 (거짓); 반품 (급여 한도);
getAttributeByName은 kèo tỷ số bóng đá euro hôm nay 시스템 기능입니다 현재 인스턴스의 속성. 그것은 세 가지 주장이 있습니다 : 튜플 유형의 인수는 함수, 이름으로 전달됩니다. 원하는 속성 및 여부를 설명하는 리턴 매개 변수 속성은 null입니다. GetAttributeByName은 데이터를 올바르게 정렬합니다 따라서 반환 값을 원하는 유형에 시전 할 수 있습니다. 예를 들어, char16 유형의 속성 이름이있는 경우 GetAttributeByName 호출은 다음과 같습니다.
char *str; ... str = (char *) getAttributeByName (t, "name", & isnull)
다음 쿼리는 kèo tỷ số bóng đá euro hôm nay에게 C_overpaid에 대해 알려줍니다 기능:
* 함수 만들기 c_overpaid (emp, int4)는 bool을 반환합니다 'pgroot/튜토리얼/obj/funcs.so'language 'c'; as
새로운 인스턴스를 구성하거나 수정하는 방법이 있습니다. C 함수 내에서 기존 인스턴스도 있습니다. 이 매뉴얼에서 논의하기 위해 복잡합니다.
이제 우리는 더 어려운 프로그램 작성 작업으로 돌아갑니다. 언어 기능. 경고 :이 매뉴얼 섹션은 그렇지 않습니다 당신을 프로그래머로 만드십시오. C를 잘 이해해야합니다 (포인터 사용 및 Malloc 메모리 관리자 포함) kèo tỷ số bóng đá euro hôm nay와 함께 사용하기 위해 C 기능을 작성하려고합니다. 그 동안 C 이외의 언어로 작성된 기능을로드 할 수 있습니다. 포스트 그레스로, 이것은 종종 어렵다 (전혀 가능할 때) Fortran 및 Pascal과 같은 다른 언어는 종종 C와 동일한 "전화 컨벤션"을 따르십시오. 즉, 다른 언어 인수와 반환 값을 전달하지 마십시오. 같은 방식. 이러한 이유로, 우리는 귀하의 프로그래밍을 가정합니다 언어 기능은 C로 작성됩니다. C 구축의 기본 규칙 C 함수는 다음과 같습니다.
kèo tỷ số bóng đá euro hôm nay의 대부분의 헤더 (포함) 파일 이미 설치 중pgroot/include(그림 2 참조). 당신은해야합니다 항상 포함
-i $ pgroot/includeCC 명령 줄에서. 때때로, 당신은 당신을 찾을 수 있습니다 서버 소스 자체에있는 헤더 파일이 필요합니다 (예 : 포함하여 설치 한 파일이 필요합니다). 그 경우 하나 이상을 추가해야 할 수도 있습니다
-i $ pgroot/src/백엔드 -i $ pgroot/src/백엔드/포함 -i $ pgroot/src/backend/port/<portname -i $ pgroot/src/backend/obj(여기서 <portname은 포트의 이름입니다. 또는 sparc).
메모리를 할당 할 때 kèo tỷ số bóng đá euro hôm nay Routines Palloc을 사용하십시오 해당 C 라이브러리 루틴 Malloc 대신 Pfree 그리고 무료. Palloc이 할당 한 메모리가 해방됩니다 각 트랜잭션이 끝날 때 자동으로 메모리를 방지합니다 누출.
항상 memset 또는 BZERO. 여러 루틴 (예 : 해시 액세스 방법, 해시 가입 및 정렬 알고리즘) 원시 비트의 기능 계산 귀하의 구조에 포함되어 있습니다. 모든 필드를 초기화하더라도 귀하의 구조에는 여러 바이트의 정렬이있을 수 있습니다. 쓰레기를 포함 할 수있는 패딩 (구조의 구멍) 값.
대부분의 내부 우편 유형이 선언됩니다 kèo tỷ số bóng đá euro hôm nayh, 따라서 일반적으로 해당 파일을 다음과 같이 포함시키는 것이 좋습니다. 잘.
객체 코드를 컴파일하고로드하여 kèo tỷ số bóng đá euro hôm nay에 동적으로로드하려면 항상 특별한 플래그가 필요합니다. 방법에 대한 자세한 설명은 부록 A를 참조하십시오. 귀하의 특정 운영 체제.
이전 | 홈 | 다음 |
SQL 확장 : 기능 | up | SQL 확장 : 유형 |