이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 56 장. 절차 적 언어 토토 작성버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

46장. A 쓰기 절차적 언어 처리기

다른 언어로 작성된 함수에 대한 모든 호출 현재보다"버전 1"인터페이스 컴파일된 언어의 경우(여기에는 사용자 정의 함수가 포함됩니다. 절차적 언어, SQL로 작성된 함수 및 함수 버전 0의 컴파일된 언어 인터페이스를 사용하여)호출 젠 토토특정 함수 언어. 실행하는 것은 호출 처리기의 책임입니다. 해석하는 등 의미 있는 방식으로 기능을 수행합니다. 제공된 소스 텍스트. 이 장에서는 새로운 절차가 어떻게 진행되는지 설명합니다. 언어의 호출 젠 토토를 작성할 수 있습니다.

절차적 언어에 대한 호출 젠 토토는 다음과 같습니다."정상"다음 형식으로 작성되어야 하는 함수 버전 1 인터페이스를 사용하는 C와 같은 컴파일된 언어 에 등록됨포스트그레SQL다음과 같이 인수를 사용하지 않고 유형을 반환함언어_젠 토토. 이 특별한 유사 유형은 다음을 식별합니다. 호출 처리기로서의 기능을 수행하고 호출되는 것을 방지합니다. SQL 명령에서 직접.

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

함수 항목을 가져오는 것은 호출 처리기에 달려 있습니다. 시스템 테이블에서pg_proc그리고 호출된 함수의 인수 및 반환 유형을 분석합니다.AS다음 절함수 생성함수에 대한 명령은 다음과 같습니다. 에서 찾았습니다.prosrcpg_proc행. 이는 일반적으로 소스 텍스트는 절차적 언어로 되어 있지만 이론적으로는 다음과 같을 수 있습니다. 파일의 경로 이름 등 기타 다른 것 호출 젠 토토에게 수행할 작업을 자세히 알려줍니다.

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

절차적 언어 함수가 트리거로 호출되면, 일반적인 방식으로 인수가 전달되지 않지만,FunctionCallInfoData컨텍스트필드는 a를 가리킵니다.트리거데이터구조라기보다는NULL일반 함수 호출과 같습니다. 에이 언어 처리기는 다음에 대한 메커니즘을 제공해야 합니다. 트리거에 도달하는 절차적 언어 함수 정보.

이것은 절차적 언어 처리기를 위한 템플릿입니다. C:

#include "postgres.h"
#include "executor/spi.h"
#include "명령/trigger.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;

        회수 = ...

    그렇지 않으면

        /*
         * 함수로 호출됨
         */

        회수 = ...

    반환 회수;

대신 몇 천 줄의 코드만 추가하면 됩니다. 통화 젠 토토를 완료하려면 점을 클릭하세요.

젠 토토 함수를 로드 가능한 파일로 컴파일한 후 모듈(참조섹션 32.9.6), 다음 명령을 따른 다음 샘플 절차를 등록하세요. 언어:

함수 생성 plsample_call_handler() 반환 Language_handler
    그대로 '파일 이름'
    언어 C;
언어 만들기 plsample
    젠 토토 plsample_call_handler;

표준 배포판에 포함된 절차적 언어 자신만의 호출 처리기를 작성하려고 할 때 좋은 참고 자료입니다. 다음을 살펴보세요.src/pl하위 디렉토리 소스 트리.