만들기 [신뢰할 수있는] [절차] 배트맨 토토 만들기langname' 매니저call_handlerLancompiler '댓글'
신뢰할 수있는배트맨 토토에 대한 전화 처리기는 안전합니다. 즉, 제공합니다 액세스를 우회 할 수있는 기능이없는 사용자가 없습니다 제한. 등록 할 때이 키워드가 생략 된 경우 배트맨 토토, 사용자 만PostgresSuperUser 권한이 사용할 수 있습니다 새로운 기능을 만드는이 배트맨 토토.
새로운 절차 언어의 이름. 언어 이름은 사례 둔감합니다. 절차 적 언어는 할 수 없습니다 내장 된 언어 중 하나를 무시하십시오Postgres.
call_handleris 이전에 등록 된 기능의 이름 PL 절차를 실행하기 위해 호출.
theLancompiler인수입니다 에 삽입 될 문자열Lancompiler새로운 속성PG_LANGUAGE입력. 현재,Postgres사용하지 않습니다 이 속성은 어떤 식 으로든
사용언어 생성, aPostgres사용자는 새 언어를 등록 할 수 있습니다 와 함께Postgres. 그후, 이 새로운 경우 기능 및 트리거 절차를 정의 할 수 있습니다. 언어. 사용자는가 있어야합니다.Postgres등록하기위한 슈퍼 서서 권한 a 새로운 배트맨 토토.
참고 :inPostgres7.1 이상, 전화 처리기 "버전 1"기능 관리자 인터페이스를 준수해야합니다. 구식 인터페이스가 아닙니다.
절차 적 언어에 대한 호출 핸들러를 작성해야합니다. C와 같은 편집 된 언어로Postgres함수로 논쟁이없고 반환opaque불특정 또는 정의되지 않은 유형의 자리 표시자인 유형. 이것 호출 핸들러가 직접 호출되는 것을 방지합니다. 쿼리에서 기능. (그러나 주장은 제공 될 수 있습니다 PL이 제공하는 언어로 기능 할 때 실제 통화 핸들러가 실행됩니다.)
통화 핸들러는 다른 것과 같은 방식으로 호출됩니다. 함수 : 기능 CallinFodata에 대한 포인터를 수신합니다 인수 값과 정보를 포함하는 구조 함수라고 불리며 데이텀 결과를 반환 할 것으로 예상됩니다. (그리고 아마도isnull필드 SQL을 반환하려면 functioncallinfodata struct 널 결과). 통화 핸들러와 an의 차이점 일반적인 callee 기능은입니다.flinfo- fn_oid필드 FunctionCallinFodata struct는 PL의 OID를 포함합니다 통화 핸들러 자체가 아닌 기능. 전화 핸들러는이 필드를 사용하여 어떤 기능을 수행 해야하는지 실행하다. 또한 통과 된 인수 목록이 설정되었습니다 대상 PL 기능의 선언에 따라 통화 핸들러.
전화 핸들러에 달려 있습니다.PG_PROC입력 및 인수를 분석합니다 호출 된 절차의 반환 유형. 의 AS 절기능 만들기절차의 것입니다 에서 발견prosrc속성PG_PROC테이블 입력. 이것은 일 수 있습니다 절차 언어 자체의 소스 텍스트 (예 : pl/tcl), 파일에 대한 pathname 또는 다른 것을 알려주는 다른 것 핸들러에게 자세히해야 할 일을 호출하십시오.
종종 동일한 함수는 SQL 당 여러 번 호출됩니다. 성명. 통화 핸들러는 반복적 인 조회를 피할 수 있습니다 를 사용하여 호출 함수에 대한 정보flinfo- fn_extra필드. 이것은 처음에 할 것입니다 NULL이지만 통화 핸들러에서 설정할 수 있습니다. PL 기능에 대한 정보. 후속 통화에서 ifflinfo- fn_extra이미 있습니다 Nuln inull이면 사용할 수 있고 정보 조회 단계를 사용할 수 있습니다. 건너 뛰었습니다. 통화 핸들러는 조심해야합니다.flinfo- fn_extra는 메모리를 가리키도록 만들어졌습니다 적어도 현재 쿼리가 끝날 때까지 살 것입니다. FMGRINFO 데이터 구조는 그렇게 오래 유지할 수 있기 때문입니다. 하나 이를 수행하는 방법은 메모리에 추가 데이터를 할당하는 것입니다. 컨텍스트에 의해 지정flinfo- fn_mcxt; 이러한 데이터는 일반적으로 가질 것입니다 fmgrinfo 자체와 같은 수명. 그러나 핸들러는 할 수 있습니다 또한 캐시를 할 수 있도록 더 긴 컨텍스트를 사용하도록 선택하십시오. 쿼리 전체의 함수 정의 정보.
PL 함수가 트리거로 호출되면 명시 적 없음 인수는 통과되었지만 functionCallInfodata 's컨텍스트TriggerData 노드에서 필드 포인트, 평범한 기능 호출에있는 것처럼 null이 아닌 대신. PL 핸들러는 PL 기능에 대한 메커니즘을 제공해야합니다. 트리거 정보.
use기능 생성생성 a 기능.
use배트맨 토토 삭제절차를 삭제합니다 배트맨 토토.
표 참조PG_LANGUAGEfor 추가 정보 :
테이블 "PG_LANGUAGE" 속성 | 유형 | 수정 자 --------------+---------+---------- lanname | 이름 | lanispl | 부울 | lanpltrusted | 부울 | lanplcallfoid | oid | 랜 컴필라 | 텍스트 | lanname | lanispl | lanpltrusted | lanplcallfoid | 랜 컴필라 -------------+--------+---------------------------------------- 내부 | f | f | 0 | N/A C | f | f | 0 | /bin/cc SQL | f | f | 0 | Postgres
절차 적 언어에 대한 호출 핸들러는 일반적으로 C로 작성되고 '내부'또는 'C'언어로 등록되었습니다. 백엔드에 연결되어 있는지 또는 동적으로로드. 통화 핸들러는 구식을 사용할 수 없습니다 'C'기능 인터페이스.
현재, 절차 적 배트맨 토토에 대한 정의는 할 수 없습니다 그들이 만들어지면 변경됩니다.
이것은 c :로 작성된 pl 핸들러의 템플릿입니다.
#include "executor/spi.h" #include "명령/trigger.h" #include "utils/elog.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 리턴;
수천 줄의 코드 만 추가해야합니다. PL 호출 핸들러를 완료하는 점. 보다기능 만들기컴파일 방법에 대한 정보 로드 가능한 모듈로.
다음 명령은 샘플 절차를 등록합니다 언어:
함수 만들기 plsample_call_handler ()는 불투명합니다 '/usr/local/pgsql/lib/plsample.so'로 언어 'c'; 절차 언어 'plsample'만들기 핸들러 plsample_call_handler Lancompiler 'pl/sample';