이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 와이즈 토토 생성버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

생성 배트맨 토토

이름

배트맨 토토 생성-새로운 것을 정의합니다 기능을위한 배트맨 토토

시놉시스

만들기 [신뢰할 수있는] [절차] 배트맨 토토 만들기langname'
    매니저call_handlerLancompiler '댓글'

입력

신뢰할 수있는

신뢰할 수있는배트맨 토토에 대한 전화 처리기는 안전합니다. 즉, 제공합니다 액세스를 우회 할 수있는 기능이없는 사용자가 없습니다 제한. 등록 할 때이 키워드가 생략 된 경우 배트맨 토토, 사용자 만PostgresSuperUser 권한이 사용할 수 있습니다 새로운 기능을 만드는이 배트맨 토토.

langname

새로운 절차 언어의 이름. 언어 이름은 사례 둔감합니다. 절차 적 언어는 할 수 없습니다 내장 된 언어 중 하나를 무시하십시오Postgres.

핸들러call_handler

call_handleris 이전에 등록 된 기능의 이름 PL 절차를 실행하기 위해 호출.

댓글

theLancompiler인수입니다 에 삽입 될 문자열Lancompiler새로운 속성PG_LANGUAGE입력. 현재,Postgres사용하지 않습니다 이 속성은 어떤 식 으로든

출력

생성

배트맨 토토가 있으면이 메시지가 반환됩니다 성공적으로 만들어졌습니다.

오류 : PL 핸들러 기능funcName()는 그렇지 않습니다 존재하다

이 오류는 함수가 있으면 반환됩니다funcName()는 찾을 수 없습니다.

설명

사용언어 생성, aPostgres사용자는 새 언어를 등록 할 수 있습니다 와 함께Postgres. 그후, 이 새로운 경우 기능 및 트리거 절차를 정의 할 수 있습니다. 언어. 사용자는가 있어야합니다.Postgres등록하기위한 슈퍼 서서 권한 a 새로운 배트맨 토토.

PL 핸들러 작성

참고 :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'기능 인터페이스.

현재, 절차 적 배트맨 토토에 대한 정의는 할 수 없습니다 그들이 만들어지면 변경됩니다.

usage

이것은 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';

호환성

SQL92

언어 생성isPostgres확장. 없음언어 생성진술SQL92.