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

55장. 절차적 스포츠 토토 베트맨 처리기 작성

현재 언어가 아닌 다른 언어로 작성된 함수에 대한 모든 호출버전 1컴파일된 스포츠 토토 베트맨용 인터페이스(여기에는 사용자 정의 절차적 스포츠 토토 베트맨의 함수와 SQL로 작성된 함수가 포함됨)호출 핸들러특정 언어에 대한 함수입니다. 제공된 소스 텍스트를 해석하는 등 의미 있는 방식으로 함수를 실행하는 것은 호출 핸들러의 책임입니다. 이 장에서는 새로운 절차적 언어의 호출 핸들러를 작성하는 방법을 간략하게 설명합니다.

절차적 언어에 대한 호출 핸들러는 다음과 같습니다.정상버전 1 인터페이스를 사용하여 C와 같은 컴파일 언어로 작성되고 등록되어야 하는 함수포스트그레SQL인수를 사용하지 않고 유형을 반환함스포츠 토토 베트맨_처리자. 이 특별한 의사 유형은 함수를 호출 핸들러로 식별하고 SQL 명령에서 직접 호출되는 것을 방지합니다. C 언어 호출 규칙 및 동적 로딩에 대한 자세한 내용은 다음을 참조하세요.PostgreSQL : 문서 : 10 : 37.9. C- 언어 스포츠 토토 결과.

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

다음에서 함수 항목을 가져오는 것은 호출 핸들러에 달려 있습니다.pg_proc시스템 카탈로그를 작성하고 호출된 함수의 인수 및 반환 유형을 분석합니다.AS다음 절함수 생성함수에 대한 명령은 다음에서 찾을 수 있습니다.prosrcpg_proc행. 이는 일반적으로 절차적 언어의 소스 텍스트이지만 이론적으로는 파일의 경로 이름이나 호출 핸들러에게 세부적으로 수행할 작업을 알려주는 다른 내용일 수 있습니다.

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

절차적 스포츠 토토 베트맨 함수가 트리거로 호출되면 일반적인 방법으로 인수가 전달되지 않지만FunctionCallInfoData's컨텍스트필드 포인트 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"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(plsample_call_handler);

데이텀
plsample_call_handler(PG_FUNCTION_ARGS)

    데이텀 복구;

    if (CALLED_AS_TRIGGER(fcinfo))

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

        회수 = ...

    그렇지 않으면

        /*
         * 함수로 호출됨
         */

        회수 = ...

    반환 회수;

호출 핸들러를 완성하려면 점 대신 수천 줄의 코드만 추가하면 됩니다.

핸들러 함수를 로드 가능한 모듈로 컴파일한 후(참조섹션 37.9.5), 다음 명령은 샘플 절차 언어를 등록합니다.

함수 생성 plsample_call_handler() 반환 Language_handler
    그대로 '파일 이름'
    스포츠 토토 베트맨 C;
스포츠 토토 베트맨 만들기 plsample
    핸들러 plsample_call_handler;

호출 핸들러를 제공하는 것만으로도 최소한의 절차적 언어를 생성할 수 있지만 언어를 더욱 편리하게 사용할 수 있도록 선택적으로 제공할 수 있는 다른 두 가지 기능이 있습니다. 이것들은검증기그리고인라인 핸들러. 스포츠 토토 베트맨별 검사를 수행하는 동안 유효성 검사기를 제공할 수 있습니다.함수 생성. 언어가 다음을 통해 실행되는 익명 코드 블록을 지원할 수 있도록 인라인 핸들러를 제공할 수 있습니다.DO명령.

검사기가 절차적 스포츠 토토 베트맨에 의해 제공되는 경우 유형의 단일 매개변수를 취하는 함수로 선언되어야 합니다.oid. 유효성 검사기의 결과는 무시되므로 관례적으로 반환하도록 선언됩니다.무효. 유효성 검사기는 a가 끝날 때 호출됩니다.함수 생성절차적 스포츠 토토 베트맨로 작성된 함수를 생성하거나 업데이트한 명령입니다. 전달된 OID는 함수의 OID입니다.pg_proc행. 유효성 검사기는 일반적인 방법으로 이 행을 가져와서 적절한 검사를 수행해야 합니다. 먼저 전화하세요.CheckFunctionValidatorAccess()사용자가 달성할 수 없는 유효성 검사기에 대한 명시적인 호출을 진단하기 위해함수 생성. 그런 다음 일반적인 검사에는 함수의 인수 및 결과 유형이 언어에서 지원되는지, 함수 본문이 언어에서 구문적으로 올바른지 확인하는 것이 포함됩니다. 유효성 검사기가 함수가 괜찮다고 판단하면 그냥 반환해야 합니다. 오류가 발견되면 일반을 통해 이를 보고해야 합니다.ereport()오류 보고 메커니즘. 오류가 발생하면 트랜잭션이 강제로 롤백되므로 잘못된 함수 정의가 커밋되는 것을 방지할 수 있습니다.

유효성 검사기 함수는 일반적으로 다음을 존중해야 합니다.check_function_bodies매개변수: 꺼져 있으면 비용이 많이 들거나 상황에 맞는 검사를 건너뛰어야 합니다. 언어가 컴파일 타임에 코드 실행을 제공하는 경우 유효성 검사기는 그러한 실행을 유도하는 검사를 억제해야 합니다. 특히 이 매개변수는 다음으로 꺼집니다.pg_dump그래서 다른 데이터베이스 객체에 대한 함수 본문의 종속성이나 부작용에 대해 걱정하지 않고 절차적 언어 함수를 로드할 수 있습니다. (이 요구 사항 때문에 호출 핸들러는 유효성 검사기가 함수를 완전히 검사했다고 가정하지 않아야 합니다. 유효성 검사기를 갖는 요점은 호출 핸들러가 검사를 생략하도록 하는 것이 아니라 a에 명백한 오류가 있는 경우 즉시 사용자에게 알리는 것입니다.함수 생성명령.) 정확히 무엇을 확인할지 선택하는 것은 대부분 유효성 검사기 기능의 재량에 달려 있지만 핵심은함수 생성코드는 실행만 됩니다SET다음 경우에 함수에 첨부된 절check_function_bodies켜져 있습니다. 따라서 결과가 GUC 매개변수의 영향을 받을 수 있는 검사는 다음과 같은 경우 건너뛰어야 합니다.check_function_bodiesoff, 덤프를 다시 로드할 때 잘못된 실패를 방지하기 위해.

인라인 핸들러가 절차적 언어에 의해 제공되는 경우 유형의 단일 매개변수를 사용하는 함수로 선언되어야 합니다.내부. 인라인 핸들러의 결과는 무시되므로 관례적으로 다음을 반환하도록 선언됩니다.무효. 인라인 핸들러는 다음과 같은 경우 호출됩니다.DO절차적 스포츠 토토 베트맨를 지정하여 명령문이 실행됩니다. 실제로 전달된 매개변수는에 대한 포인터입니다.InlineCodeBlock구조체, 여기에 대한 정보가 포함되어 있습니다.DO문의 매개변수, 특히 실행할 익명 코드 블록의 텍스트. 인라인 핸들러는 이 코드를 실행하고 반환해야 합니다.

이러한 함수 선언을 모두 래핑하는 것이 좋습니다.스포츠 토토 베트맨 생성명령 자체를,확장그래서 간단합니다확장 프로그램 생성명령으로 스포츠 토토 베트맨를 설치하기에 충분합니다. 참조PostgreSQL : 문서 : 10 : 37.15. 관련 객체를 스포츠 토토 베트맨자로 포장확장 프로그램 작성에 대한 정보.

표준 배포판에 포함된 절차적 언어는 자신만의 언어 처리기를 작성하려고 할 때 좋은 참고 자료가 됩니다. 다음을 살펴보세요.src/pl소스 트리의 하위 디렉토리.스포츠 토토 베트맨 생성참조 페이지에도 유용한 세부정보가 있습니다.