지원되지 않는 버전 :6.3
이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다current버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.
PostgreSQL
이전 31 장. SQL 확장 : 스포츠 토토 다음

프로그래밍 언어 스포츠 토토

프로그래밍 기본 유형에 대한 언어 스포츠 토토

내부적으로 Postgres는 기본 유형을 "메모리의 덩어리"로 간주합니다. 유형을 차례로 정의하는 사용자 정의 스포츠 토토 Postgres가 작동 할 수있는 방식을 정의하십시오. 즉, Postgres입니다 디스크에서 데이터를 저장하고 검색하고 사용합니다. 데이터를 입력, 프로세스 및 출력 할 수있는 사용자 정의 스포츠 토토. 베이스 유형은 세 가지 내부 형식 중 하나를 가질 수 있습니다.

  • 통과 별 가치, 고정 길이

  • 참조 별 통과, 고정 길이

  • 참조별로 전달, 가변 길이

바이 값 유형은 길이가 1, 2 또는 4 바이트 일 수 있습니다 ( 컴퓨터는 다른 크기의 가치 유형을 지원합니다). 포스트 그레스 그 자체는 정수 유형 만 가치로 전달합니다. 당신은 조심해야합니다 크기가 같은 크기가되도록 유형을 정의하십시오 (바이트) 모든 아키텍처에서. 예를 들어, 긴 유형은 위험합니다 일부 기계에서는 4 바이트이고 다른 기계의 8 바이트이기 때문에 int 유형은 대부분의 유닉스 머신에서 4 바이트입니다 ( 대부분의 개인용 컴퓨터). INT4의 합리적인 구현 Unix 기계의 유형은 다음과 같습니다.

/ * 4-byte 정수, 가치에 의해 통과 */
    typedef int int4;

반면에, 모든 크기의 고정 길이 유형이 전달 될 수 있습니다. 회의 별. 예를 들어 다음은 다음과 같습니다 Postgres char16 유형 :

/ * 16 바이트 구조, 참조로 통과 */
         typedef struct 
             숯 데이터 [16];
          char16;

그러한 유형에 대한 포인터 만 전달할 때 사용할 수 있습니다. 포스트 그레스 기능. 마지막으로 모든 가변 길이 유형이 있어야합니다 또한 참조로 전달됩니다. 모든 가변 길이 유형이 시작되어야합니다 정확히 4 바이트의 길이 필드와 모든 데이터가 저장 될 수 있습니다. 해당 유형 내에서는 즉시 메모리에 위치해야합니다. 그 길이 필드에 따라. 길이 필드는 총 길이입니다 구조 (즉, 길이 필드의 크기를 포함합니다. 그 자체). 텍스트 유형을 다음과 같이 정의 할 수 있습니다.

typedef struct 
             int4 길이;
             숯 데이터 [1];
          텍스트;

분명히 데이터 필드는 모든 것을 유지하기에 충분하지 않습니다. 가능한 문자열 - 그러한 구조를 C. 가변 길이 유형을 조작 할 때는주의해야합니다. 올바른 양의 메모리를 할당하고 길이를 초기화합니다. 필드. 예를 들어, 텍스트에 40 바이트를 저장하려면 구조, 우리는 다음과 같은 코드 조각을 사용할 수 있습니다.

#include "postgres.h"
         #include "utils/palloc.h"
         ...
         숯 버퍼 [40]; / * 소스 데이터 */
         ...
         텍스트 *대상 = (텍스트 *) palloc (varhdrsz + 40);
         대상- 길이 = varhdrsz + 40;
         Memmove (대상- 데이터, 버퍼, 40);
         ...

이제 우리는베이스를위한 가능한 모든 구조를 살펴 보았습니다. 유형, 우리는 실제 스포츠 토토의 몇 가지 예를 보여줄 수 있습니다. 가정하다funcs.c모양 :

#include <string.h
         #include "postgres.h" / * 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 구조와 같은 고정 레이아웃이 없습니다. 복합 유형의 인스턴스에는 널 필드가 포함될 수 있습니다. 게다가, 상속 계층의 일부인 복합 유형은 같은 상속의 다른 구성원과는 다른 필드 계층. 따라서 Postgres는 절차 인터페이스를 제공합니다 C. Composite 유형의 필드에 액세스하는 C. 인스턴스 세트, 각 인스턴스가 스포츠 토토으로 전달됩니다. 유형 튜플의 불투명 구조로서. 우리가 쓰고 싶다고 가정 해 봅시다 쿼리에 응답하는 스포츠 토토

* 이름, c_overpaid (EMP, 1500)를 초과 지불로 선택하십시오
           emp에서
           여기서 name = 'bill'또는 name = 'sam';
위의 쿼리에서 c_overpaid를 다음과 같이 정의 할 수 있습니다.
#include "postgres.h" / * char16 등 * /
         #include "libpq-fe.h" / * 튜플 * /
         부
         c_overpaid (tuple t,/ * 현재 emp */
                    int4 한계)

             bool isnull = false;
             int4 급여;
             급여 = (int4) getAttributeByName (t, "Salary", & isnull);
             if (isnull)
                 반환 (거짓);
             반품 (급여 한도);

getAttributeByName은 Postgres 시스템 기능입니다 현재 인스턴스의 속성. 그것은 세 가지 주장이 있습니다 : 튜플 유형의 인수는 함수, 이름으로 전달됩니다. 원하는 속성 및 여부를 설명하는 리턴 매개 변수 속성은 null입니다. GetAttributeByName은 데이터를 올바르게 정렬합니다 따라서 반환 값을 원하는 유형에 시전 할 수 있습니다. 예를 들어, char16 유형의 속성 이름이있는 경우 GetAttributeByName 호출은 다음과 같습니다.

char *str;
         ...
         str = (char *) getAttributeByName (t, "name", & isnull)

다음 쿼리는 Postgres에게 C_overpaid에 대해 알려줍니다 기능:

* 함수 만들기 c_overpaid (emp, int4)는 bool을 반환합니다
              'pgroot/튜토리얼/obj/funcs.so'language 'c'; as

새로운 인스턴스를 구성하거나 수정하는 방법이 있지만 C 함수 내에서 기존 인스턴스도 있습니다. 이 매뉴얼에서 논의하기 위해 복잡합니다.

경고

이제 우리는 더 어려운 프로그램 작성 작업으로 돌아갑니다. 언어 기능. 경고 :이 매뉴얼 섹션은 그렇지 않습니다 당신을 프로그래머로 만드십시오. C를 잘 이해해야합니다 (포인터 사용 및 Malloc 메모리 관리자 포함) Postgres와 함께 사용하기 위해 C 기능을 작성하려고합니다. 그 동안 C 이외의 언어로 작성된 기능을로드 할 수 있습니다. 포스트 그레스로, 이것은 종종 어렵다 (전혀 가능할 때) Fortran 및 Pascal과 같은 다른 언어는 종종 C와 동일한 "전화 컨벤션"을 따르십시오. 즉, 다른 언어 인수와 반환 값을 전달하지 마십시오. 같은 방식. 이러한 이유로, 우리는 귀하의 프로그래밍을 가정합니다 언어 기능은 C로 작성됩니다. C 구축의 기본 규칙 C 함수는 다음과 같습니다.

  • Postgres의 대부분의 헤더 (포함) 파일 이미 설치 중pgroot/include(그림 2 참조). 당신은해야합니다 항상 포함

    -i $ pgroot/include
    CC 명령 줄에서. 때때로, 당신은 당신을 찾을 수 있습니다 서버 소스 자체에있는 헤더 파일이 필요합니다 (예 : 포함하여 설치 한 파일이 필요합니다). 그 경우 하나 이상을 추가해야 할 수도 있습니다
    -i $ pgroot/src/백엔드
                    -i $ pgroot/src/백엔드/포함
                    -i $ pgroot/src/backend/port/<portname
                    -i $ pgroot/src/backend/obj
    (여기서 <portname은 포트의 이름입니다. 또는 sparc).
  • 메모리를 할당 할 때 Postgres Routines Palloc을 사용하십시오 해당 C 라이브러리 루틴 Malloc 대신 Pfree 그리고 무료. Palloc이 할당 한 메모리가 해방됩니다 각 트랜잭션이 끝날 때 자동으로 메모리를 방지합니다 누출.

  • 항상 Memset 또는 BZERO. 여러 루틴 (예 : 해시 액세스 방법, 해시 가입 및 정렬 알고리즘) 원시 비트의 스포츠 토토 계산 귀하의 구조에 포함되어 있습니다. 모든 필드를 초기화하더라도 귀하의 구조에는 여러 바이트의 정렬이있을 수 있습니다. 쓰레기를 포함 할 수있는 패딩 (구조의 구멍) 값.

  • 대부분의 내부 우편 유형이 선언됩니다 Postgres.h, 따라서 일반적으로 해당 파일을 다음과 같이 포함시키는 것이 좋습니다. 잘.

  • 객체 코드를 컴파일하고로드하여 Postgres에 동적으로로드하려면 항상 특별한 플래그가 필요합니다. 방법에 대한 자세한 설명은 부록 A를 참조하십시오. 귀하의 특정 운영 체제.


이전 다음
SQL 확장 : 스포츠 토토 up SQL 확장 : 유형