이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

9.8. 절차 토토 꽁 머니 처리기

언어로 작성된 모든 함수에 대한 모든 호출 기타 현재보다"버전 1"인터페이스 컴파일 된 언어의 경우 (여기에는 사용자 정의의 기능이 포함됩니다 절차 언어, SQL로 작성된 기능 및 기능 버전 0 컴파일 된 언어 인터페이스 사용)를 사용하여 A를 통과합니다.전화 핸들러특정에 대한 기능 토토 꽁 머니. 콜 핸들러의 책임은 해석하는 것과 같은 의미있는 방식으로 기능 제공된 소스 텍스트. 이 섹션에서는 토토 꽁 머니 호출 방법에 대해 설명합니다 핸들러를 작성할 수 있습니다. 이것은 일반적인 작업이 아닙니다 역사상 몇 번만 행해졌습니다postgresql그러나 주제 자연스럽게이 장에 속하며 재료는 의 확장 가능한 특성에 대한 통찰력PostgresqlSystem.

절차 토토 꽁 머니의 호출 핸들러는입니다."정상"함수 C와 같은 컴파일 된 토토 꽁 머니 및 등록PostgreSQL논쟁을 취하지 않고 반환Language_Handler타입. 이것 특수 의사 유형은 핸들러를 통화 처리기로 식별하고 쿼리로 직접 호출되는 것을 방지합니다.

참고 :inpostgresql7.1 이후에 전화 처리자 를 준수해야합니다."버전 1"기존 스타일 인터페이스가 아닌 기능 관리자 인터페이스.

통화 핸들러는 다른 것과 같은 방식으로 호출됩니다. 기능 : A에 대한 포인터를받습니다functionCallInfodata struct인수 값과 정보 포함 호출 된 함수에 대해서는 A를 반환 할 것으로 예상됩니다.Datum결과 (그리고 아마도를 설정할 수 있습니다isnull필드functionCallInfodata원하는 경우 구조 SQL NULL 결과를 반환하십시오). 통화 핸들러의 차이점 그리고 일반적인 callee 기능은입니다.flinfo- fn_oid필드functionCallInfodata구조는 다음을 포함합니다 호출 핸들러가 아닌 실제 함수의 OID 그 자체. 통화 핸들러는이 필드를 사용하여 어느 것을 결정해야합니다. 실행할 기능. 또한 통과 된 인수 목록이 설정되었습니다 대상 함수의 선언에 따라 통화 핸들러.

전화 핸들러에 달려 있습니다.PG_PROC입력 및 인수 분석 및 호출 된 절차의 반환 유형. 의 AS 절함수 생성절차의 것입니다 에서 발견prosrc속성PG_PROC테이블 입력. 이것은 될 수 있습니다 절차 토토 꽁 머니 자체의 소스 텍스트 ( pl/tcl), 파일의 경로 이름 또는 다른 핸들러에게 자세히해야 할 일을 호출하십시오.

종종 동일한 함수는 SQL 당 여러 번 호출됩니다. 성명. 통화 핸들러는 반복적 인 조회를 피할 수 있습니다 를 사용하여 호출 함수에 대한 정보flinfo- fn_extra필드. 이것은 처음에 할 것입니다 NULL이지만 통화 핸들러에서 설정할 수 있습니다. PL 기능에 대한 정보. 후속 통화에서 ifflinfo- fn_extra이미 있습니다 Nuln inull이면 사용할 수 있고 정보 조회 단계를 사용할 수 있습니다. 건너 뛰었습니다. 통화 핸들러는 조심해야합니다.flinfo- fn_extra는 메모리를 가리키도록 만들어졌습니다 그것은 적어도 현재 쿼리가 끝날 때까지 살 것입니다.fmgrinfo데이터 구조 일 수 있습니다 그렇게 오래 유지했습니다. 이를 수행하는 한 가지 방법은 추가 데이터를 할당하는 것입니다. 에 의해 지정된 메모리 컨텍스트에서flinfo- fn_mcxt; 이러한 데이터는 일반적으로됩니다 와 같은 수명을fmgrinfo자체. 그러나 핸들러도 할 수 있습니다 캐시를 할 수 있도록 더 긴 컨텍스트를 사용하도록 선택하십시오. 쿼리 전체의 함수 정의 정보.

PL 함수가 트리거로 호출되면 명시 적 없음 인수는 통과되었지만functionCallInfodata's컨텍스트필드 포인트 ATriggerData노드는 그대로 무효가되지 않습니다 평범한 기능 호출에 있습니다. 토토 꽁 머니 처리기가 제공해야합니다 PL 기능을위한 메커니즘 트리거에 도달합니다 정보.

이것은 c :로 작성된 PL 핸들러의 템플릿입니다.

#include "postgres.h"
#include "Executor/Spi.h"
#include "명령/trigger.h"
#include "utils/elog.h"
#include "fmgr.h"
#include "Access/Heapam.h"
#include "utils/syscache.h"
#include "카탈로그/PG_PROC.H"
#include "카탈로그/pg_type.h"

pg_function_info_v1 (plsample_call_handler);

자료
plsample_call_handler (pg_function_args)

    Datum Retval;

    if (호출 _as_trigger (fcinfo))

        /*
         * 트리거 절차라고합니다
         */
        triggerData *trigdata = (triggerData *) fcinfo- 컨텍스트;

        retval = ...

    또 다른 
        /*
         * 함수로 호출됩니다
         */

        retval = ...

    retval 리턴;

수천 줄의 코드 만 추가해야합니다. 통화 핸들러를 완료하는 점. 보다섹션 9.5컴파일 방법에 대한 정보 로드 가능한 모듈로.

다음 명령은 샘플 절차를 등록합니다 언어:

함수 만들기 plsample_call_handler () language_handler를 반환합니다
    '/usr/local/pgsql/lib/plsample'으로
    토토 꽁 머니 C;
토토 꽁 머니 plsample을 만듭니다
    핸들러 plsample_call_handler;