다른 언어로 작성된 함수에 대한 모든 호출 현재보다"버전 1"인터페이스 컴파일된 언어의 경우(여기에는 사용자 정의 함수가 포함됩니다. 절차적 언어, SQL로 작성된 함수 및 함수 버전 0의 컴파일된 언어 인터페이스를 사용하여)호출 핸들러특정 함수 토토 꽁 머니. 실행하는 것은 호출 처리기의 책임입니다. 해석하는 등 의미 있는 방식으로 기능을 수행합니다. 제공된 소스 텍스트. 이 섹션에서는 토토 꽁 머니 호출 방법을 설명합니다. 핸들러를 작성할 수 있습니다. 사실 이것은 일반적인 작업이 아닙니다. 역사상 몇 번만 수행되었습니다.포스트그레SQL, 하지만 주제는 당연히 이 장에 속하며 자료는 다음과 같습니다. 확장 가능한 특성에 대한 통찰력포스트그레SQL시스템.
절차적 언어에 대한 호출 핸들러는 다음과 같습니다."정상"함수는 다음 형식으로 작성되어야 합니다. C와 같은 컴파일된 언어로 등록됨포스트그레SQL아무 주장도 취하지 않고 반환하는토토 꽁 머니_처리자유형. 이 특수 의사 유형은 핸들러를 호출 핸들러로 식별하고 쿼리에서 직접 호출되는 것을 방지합니다.
참고:에포스트그레SQL7.1 이상, 핸들러 호출 다음을 준수해야 합니다."버전 1"기능 관리자 인터페이스, 이전 스타일 인터페이스가 아닙니다.
호출 핸들러는 다른 핸들러와 동일한 방식으로 호출됩니다. 함수: a에 대한 포인터를 받습니다.FunctionCallInfoData 구조체인수 값과 정보를 포함 호출된 함수에 대해 설명하고 다음을 반환할 것으로 예상됩니다.데이텀결과(그리고 아마도를 설정함)isnull필드의FunctionCallInfoData구조, 원하는 경우 SQL NULL 결과를 반환합니다). 통화 처리기의 차이점 일반적인 호출 수신자 함수는 다음과 같습니다.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의컨텍스트필드 포인트 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;
회수 = ...
그렇지 않으면
/*
* 함수로 호출됨
*/
회수 = ...
반환 회수;
대신 몇 천 줄의 코드만 추가하면 됩니다. 호출 처리기를 완료하려면 점을 클릭하세요. 참조섹션 9.5컴파일 방법에 대한 정보 로드 가능한 모듈로 변환합니다.
다음 명령은 샘플 절차를 등록합니다 언어:
함수 생성 plsample_call_handler () 반환 Language_handler
AS '/usr/local/pgsql/lib/plsample'
언어 C;
언어 만들기 plsample
핸들러 plsample_call_handler;