이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

12.7. 토토 베이적 언어 처리기

다른 언어로 작성된 함수에 대한 모든 호출 현재보다"버전 1"인터페이스 컴파일된 언어의 경우(여기에는 사용자 정의 함수가 포함됩니다. 절차적 언어, SQL로 작성된 함수 및 함수 버전 0의 컴파일된 언어 인터페이스를 사용하여)호출 핸들러특정 함수 토토 베이. 실행하는 것은 호출 처리기의 책임입니다. 해석하는 등 의미 있는 방식으로 기능을 수행합니다. 제공된 소스 텍스트. 이 섹션에서는 토토 베이 호출 방법을 설명합니다. 핸들러를 작성할 수 있습니다. 사실 이것은 일반적인 작업이 아닙니다. 역사상 몇 번만 수행되었습니다.포스트그레SQL, 하지만 주제는 당연히 이 장에 속하며 자료는 다음과 같습니다. 확장 가능한 특성에 대한 통찰력포스트그레SQL시스템.

절차적 언어에 대한 호출 핸들러는 다음과 같습니다."정상"함수는 다음 형식으로 작성되어야 합니다. C와 같은 컴파일된 언어로 등록됨포스트그레SQL아무 주장도 취하지 않고 반환하는불투명유형, 자리표시자 지정되지 않거나 정의되지 않은 유형의 경우. 이렇게 하면 통화가 방지됩니다. 핸들러가 쿼리에서 함수로 직접 호출되는 것을 방지합니다. (그러나 실제 호출에서는 인수가 제공될 수 있습니다. 핸들러가 제공하는 토토 베이로 된 함수가 실행됩니다.)

참고:포스트그레SQL7.1 이상, 핸들러 호출 다음을 준수해야 합니다."버전 1"기능 관리자 인터페이스, 이전 스타일 인터페이스가 아닙니다.

호출 핸들러는 다른 핸들러와 동일한 방식으로 호출됩니다 함수: a에 대한 포인터를 받습니다.FunctionCallInfoData인수를 포함하는 구조체 호출된 함수에 대한 값과 정보입니다. a를 반환할 것으로 예상됩니다.데이텀결과(그리고 아마도isnull필드의FunctionCallInfoData구조체, 만약 그렇다면 SQL NULL 결과를 반환하려고 함). a의 차이점은 다음과 같습니다. 호출 핸들러와 일반적인 호출 수신자 함수는 다음과 같습니다.flinfo-fn_oid필드의FunctionCallInfoData구조체는 호출할 실제 함수의 OID를 포함합니다. 핸들러 자체를 호출합니다. 호출 처리기는 이 필드를 사용하여 다음을 수행해야 합니다. 실행할 기능을 결정합니다. 또한 전달된 인수 목록은 대상 선언에 따라 설정되었습니다. 호출 핸들러가 아닌 함수입니다.

다음을 가져오는 것은 호출 처리기에 달려 있습니다.pg_proc항목을 입력하고 인수를 분석하고 호출된 프로시저의 반환 유형입니다. 의 AS 절함수 생성절차는 다음과 같습니다 에서 찾았습니다.prosrc속성pg_proc테이블 항목. 이는 다음과 같습니다. 절차적 언어 자체의 소스 텍스트(예: PL/Tcl), 파일 경로 이름, 또는 자세한 내용은 핸들러를 호출하세요.

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

PL 함수가 트리거로 호출되면 명시적인 인수가 전달되었지만FunctionCallInfoData's컨텍스트필드는 a를 가리킵니다.트리거데이터노드, 그대로 NULL이 아닌 일반 함수 호출 중입니다. 언어 처리기는 다음을 제공해야 합니다. 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 "catalog/pg_proc.h"
#include "catalog/pg_type.h"

PG_FUNCTION_INFO_V1(plsample_call_handler);

데이텀
plsample_call_handler(PG_FUNCTION_ARGS)

    데이텀 복구;

    if (CALLED_AS_TRIGGER(fcinfo))

        /*
         * 트리거 프로시저로 호출됨
         */
        TriggerData *trigdata = (TriggerData *) fcinfo-context;

        회수 = ...

    그렇지 않으면 
        /*
         * 함수로 호출됨
         */

        회수 = ...

    반환 회수;

대신 몇 천 줄의 코드만 추가하면 됩니다. 호출 처리기를 완료하려면 점을 클릭하세요. 참조섹션 12.5컴파일 방법에 대한 정보 로드 가능한 모듈로 변환합니다.

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

함수 생성 plsample_call_handler () 불투명하게 반환
    AS '/usr/local/pgsql/lib/plsample'
    언어 C;
언어 만들기 plsample
    핸들러 plsample_call_handler;