이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 56 장. 절차 적 언어 토토 작성버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

48 장. 쓰기 a 절차 언어 사설 토토

언어로 작성된 모든 함수에 대한 모든 호출 기타 현재보다"버전 1"인터페이스 컴파일 된 언어의 경우 (여기에는 사용자 정의의 기능이 포함됩니다 절차 언어, SQL로 작성된 기능 및 기능 버전 0 컴파일 된 언어 인터페이스 사용)를 사용하여 A를 통과합니다.전화 사설 토토특정에 대한 기능 언어. 콜 사설 토토의 책임은 해석하는 것과 같은 의미있는 방식으로 기능 제공된 소스 텍스트. 이 장에서는 새로운 절차가 얼마나 간략하게 설명되어 있습니다 언어의 통화 처리기가 작성 될 수 있습니다.

절차 언어의 호출 사설 토토는입니다."정상"a 버전 1 인터페이스를 사용하여 C와 같은 컴파일 된 언어 등록PostgreSQLas 논쟁을하지 않고 유형을 반환사설 토토_Handler. 이 특별한 유사 형식은 식별합니다 통화 사설 토토로서의 기능은 호출되는 것을 방지합니다. SQL 명령에서 직접.

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

함수 입력을 가져 오는 것은 통화 사설 토토에 달려 있습니다. 시스템 테이블에서PG_PROC및 호출 된 함수의 인수 및 반환 유형을 분석합니다. 그만큼as함수 만들기함수에 대한 명령이 있습니다 에서 발견prosrc열의 열PG_PROC행. 이것은 일반적으로입니다 절차 적 언어의 출처 텍스트이지만 이론적으로는 파일의 경로 이름 또는 다른 것과 같은 다른 것 통화 사설 토토에게 무엇을 자세히 해야하는지 알려줍니다.

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

절차 적 언어 함수가 트리거로 호출되는 경우, 일반적인 방식으로 논쟁은 전달되지 않지만functionCallInfodata's컨텍스트필드 포인트 ATriggerData구조가 아닌 구조NULL평범한 기능 호출에있는 것처럼. 에이 언어 처리기는 메커니즘을 제공해야합니다 트리거를 얻는 절차 적 기능 정보.

이것은 절차 적 사설 토토를위한 템플릿입니다 C :

#include "postgres.h"
#include "Executor/Spi.h"
#include "명령/trigger.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 리턴;

수천 줄의 코드 만 추가해야합니다. 통화 사설 토토를 완료하기위한 점들.

사설 토토 기능을로드 가능한 상태로 컴파일 한 후 모듈 (참조섹션 34.9.6), 다음 명령에 따라 샘플 절차를 등록하십시오 언어:

함수 만들기 plsample_call_handler () 사설 토토_Handler를 반환합니다
    처럼 'filename'
    언어 C;
언어 plsample을 만듭니다
    사설 토토 plsample_call_handler;

표준 분포에 포함 된 절차 언어 자신의 통화 사설 토토를 작성하려고 할 때 좋은 참조입니다. 조사SRC/PL서브 디렉토리 소스 트리.