언어로 작성된 함수에 대한 모든 호출 기타 현재보다"버전 1"인터페이스 컴파일 된 언어의 경우 (여기에는 사용자 정의의 기능이 포함됩니다 절차 언어, SQL로 작성된 기능 및 기능 버전 0 컴파일 된 언어 인터페이스 사용) a를 통과합니다.전화 토토 커뮤니티특정에 대한 기능 언어. 콜 토토 커뮤니티의 책임은 해석하는 것과 같은 의미있는 방식으로 기능 제공된 소스 텍스트. 이 장에서는 새로운 절차가 얼마나 간략하게 설명되어 있습니다 언어의 통화 처리기가 작성 될 수 있습니다.
절차 적 언어의 호출 토토 커뮤니티는 A입니다."정상"a 버전 1 인터페이스를 사용하여 C와 같은 컴파일 된 언어 등록PostgreSQLas 논쟁을하지 않고 유형을 반환Language_Handler. 이 특별한 유사 형식은 식별합니다 통화 토토 커뮤니티로서의 기능은 호출되는 것을 방지합니다. SQL 명령에서 직접. C 언어 통화에 대한 자세한 내용 컨벤션 및 동적 하중, 참조섹션 35.9.
통화 토토 커뮤니티는 다른 것과 같은 방식으로 호출됩니다. 기능 : 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'sContext필드 포인트 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" #ifdef pg_module_magic PG_MODULE_MAGIC; #endif 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 리턴;
수천 줄의 코드 만 추가해야합니다. 통화 토토 커뮤니티를 완료하기위한 점들.
토토 커뮤니티 기능을로드 가능한 상태로 컴파일 한 후 모듈 (참조섹션 35.9.6), 다음 명령에 따라 샘플 절차를 등록하십시오 언어:
함수 만들기 plsample_call_handler () language_handler를 반환합니다 처럼 'filename' 언어 C; 언어 plsample을 만듭니다 토토 커뮤니티 plsample_call_handler;
전화 토토 커뮤니티를 제공하는 것은 최소 절차 언어에는 두 가지 다른 기능이 있습니다 언어를 더 편리하게 만들기 위해 선택적으로 제공 될 수 있습니다. 사용합니다. 이것들은Validatorand an인라인 토토 커뮤니티. 유효성 검사기가 될 수 있습니다 언어 별 점검을 수행 할 수 있도록 제공PostgreSQL : 문서 : 9.1 : 토토 캔 만들기. 인라인 언어가 지원할 수 있도록 핸들러가 제공 될 수 있습니다. 익명 코드 블록을 통해 실행 된 익명 코드 블록do명령.
유효성 검사기가 절차 언어로 제공되는 경우
유형의 단일 매개 변수를 취하는 함수로 선언 됨OID. 유효성 검사기의 결과는 무시됩니다
관습 적으로 반환으로 선언 됨void.
유효성 검사기는 A의 끝에서 호출됩니다.함수 만들기생성 한 명령 또는
절차 언어로 작성된 기능을 업데이트했습니다. 그만큼
통과 된 OID는 함수의 OID입니다PG_PROC
행. 유효성 검사기는이 행을 가져와야합니다
일반적인 방식으로, 모든 점검이 적절합니다. 첫 번째,
부르다CheckFunctionValidatorAccess ()
사용자가 할 수있는 유효성 검사기에 대한 명시적인 호출을 진단하려면
달성하지 않음함수 만들기.
그런 다음 일반적인 검사에는 함수를 확인하는 것이 포함됩니다
인수와 결과 유형은 언어에 의해 뒷받침되며
기능의 신체는 언어에서 구문 적으로 정확합니다. 만약에
유효성 검사기는 기능이 괜찮다는 것을 알게됩니다.
반품. 오류를 찾으면
정상Ereport ()
오류보고
기구. 오류를 던지면 거래 롤백이 강화됩니다
따라서 잘못된 기능 정의가 존재하는 것을 방지합니다
헌신적인.
Validator 함수는 일반적으로를 존중해야합니다.check_function_bodies매개 변수 : 꺼지면 비싸거나 상황에 맞는 점검을 건너 뛰어야합니다. 언어라면 컴파일 타임에서 Code Execution을 제공합니다 그러한 실행을 유도하는 점검을 억제해야합니다. ~ 안에 특히이 매개 변수는에 의해 꺼집니다.pg_dump절차를로드 할 수 있도록 부작용에 대해 걱정하지 않고 언어 기능 또는 다른 데이터베이스 개체에서 기능 본체의 종속성. (이 요구 사항으로 인해 통화 토토 커뮤니티는 피해야합니다 유효성 검사기가 함수를 완전히 확인했다고 가정합니다. 그만큼 유효성 검사기가있는 점은 통화 처리기가 생략하지 않도록하는 것이 아닙니다. 확인하지만 명백한 경우 즉시 사용자에게 알리려면 a 오류기능 생성명령.) 정확히 무엇을 확인 해야하는지 선택하는 것은 대부분 유효성 검사 기능의 재량, 핵심에 주목하십시오.기능 생성코드 전용 실행set클로즈는 함수에 첨부 될 때check_function_bodies켜져 있습니다. 그러므로, 결과가 GUC 매개 변수의 영향을받을 수있는 점검 확실히 건너 뛰어야 할 때check_function_bodies거짓을 피하기 위해 꺼져 있습니다 덤프를 다시로드 할 때 고장.
인라인 토토 커뮤니티가 절차 언어로 제공되는 경우, IT 유형의 단일 매개 변수를 취하는 함수로 선언해야합니다내부. 인라인 토토 커뮤니티의 결과는입니다 무시되므로 관습 적으로 반환으로 선언됩니다void. 인라인 토토 커뮤니티는 A에 호출됩니다.do명령문이 실행됩니다 절차 언어. 실제로 전달 된 매개 변수는 포인터입니다InlineCodeBlockstruct 에 대한 정보가 포함되어 있습니다.do진술의 매개 변수, 특히 익명의 텍스트 실행될 코드 블록. 인라인 토토 커뮤니티가이를 실행해야합니다 코드 및 반환.
이 모든 기능을 감싸는 것이 좋습니다 선언 및생성 언어명령 자체,확장단순하도록확장 생성명령은 설치하기에 충분합니다 언어. 보다PostgreSQL : 문서 : 9.1 : 관련 객체를 배트맨 토토자에 포장연장 작성에 관한 정보.
표준 분포에 포함 된 절차 언어 자신의 언어를 쓰려고 할 때 좋은 참조입니다. 매니저. 조사SRC/PL소스 트리의 서브 디렉토리. 그만큼언어 생성참조 페이지 몇 가지 유용한 세부 사항이 있습니다.