inPostgres, 하나와 동일한 기능 이름은 다른 기능에 사용될 수 있습니다. 인수의 수 또는 유형이 다르기 때문에. 이것은 할 것입니다 토토 캔 프로 시저 이름과 충돌하십시오. 동일한 유연성을 제공합니다 pl/토토 캔에서 내부 토토 캔 절차 이름에는 객체가 포함됩니다. 프로 시저의 PG_PROC 행의 ID는 이름의 일부입니다. 따라서, 동일한 다른 Argtype 버전Postgres토토 캔에 대해 함수가 다릅니다 도.
pl/토토 캔 언어로 함수를 만들려면 표준 구문
함수 만들기funcName(Argument-types) 반환return-typeas ' # pl/토토 캔 기능 본문 '언어'pl토토 캔 ';함수가 호출되면 인수는 다음과 같이 주어집니다. 변수$ 1 ... $ n토토 캔 절차 본문에. 결과가 반환됩니다 일반적인 방식으로 토토 캔 코드에서 Areturn진술. 예를 들어, 기능이 반환됩니다 두 개의 int4 값 중 높이는 다음과 같이 정의 될 수 있습니다.
함수 만들기 tcl_max (int4, int4)는 int4를 다시 반환합니다. if $ 1 $ 2 return $ 1 $ 2를 반환합니다 '언어'pltcl ';pl/토토 캔 함수에서 null 값을 반환하려면 executereturn_null.
복합 유형 인수는 토토 캔로 절차에 제공됩니다. 배열. 배열의 요소 이름은 속성 이름입니다. 복합 유형의. 실제 행의 속성이있는 경우 널 값은 배열에 나타나지 않습니다! 여기에 있습니다 오버 페이드 _2 함수를 정의하는 예 ( 구형Postgres문서) pl/토토 캔
함수 생성 OverPaid_2 (EMP) BOOL을 반환합니다. if 200000.0 <$ 1 (급여) "T"반환 if $ 1 (Age) <30 && 100000.0 <$ 1 (Salary) "T"반환 "F"반환 '언어'pltcl ';
때때로 (특히 설명 된 SPI 함수를 사용할 때 나중에) 일부 글로벌 상태 데이터를 갖는 것이 유용합니다. 절차에 대한 두 번의 호출 사이에 보유됩니다. 이것은 쉽게 수행됩니다 하나의 백엔드에서 실행 된 모든 PL/토토 캔 절차가 동일한 안전한 토토 캔 통역사.
원치 않는 쪽에서 PL/토토 캔 절차를 보호하는 데 도움이됩니다 효과, 배열은 각 절차에 사용할 수 있습니다. upvar 명령. 이 변수의 글로벌 이름은입니다 절차의 내부 이름과 로컬 이름은 GD입니다. 그것은 GD는 개인 상태 데이터에 사용하는 것이 좋습니다. 절차. 값에 대해서만 일반 토토 캔 글로벌 변수를 사용하십시오 여러분이 여러 가지 중에서 공유하려고합니다 절차.
트리거 절차가에 정의되어 있습니다.Postgres인수가없는 함수로 그리고 불투명의 반환 유형. 그리고 그들은 PL/토토 캔에도 있습니다 언어.
트리거 관리자의 정보는 다음 변수의 절차 본문 :
생성 트리거에서 트리거의 이름 성명.
트리거를 일으킨 테이블의 객체 ID 호출 절차.
테이블 필드 이름의 토토 캔 목록과 접두사 빈 목록 요소. 그래서 요소 이름을 찾고 있습니다 lsearch 토토 캔 명령이 동일하게 반환합니다 필드로 1에서 시작하는 양수 pg_attribute 시스템 카탈로그에 번호가 매겨져 있습니다.
이벤트에 따라 전후에 문자열 방아쇠 통화.
이벤트에 따라 문자열 행 또는 명령문 방아쇠 통화.
문자열 삽입, 업데이트 또는 삭제에 따라 방아쇠 통화 이벤트.
새 테이블 행의 값을 포함하는 배열 on 작업 삽입/업데이트 또는 삭제에서 비워
오래된 테이블 행의 값을 포함하는 배열 작업 업데이트/삭제 또는 삽입물에서 빈
위에서 설명한대로 글로벌 상태 데이터 배열.
주어진 절차에 대한 인수의 tcl 목록 생성 트리거 문에서. 논쟁도 있습니다 절차 기관에서 $ 1 ... $ n으로 접근 가능.
트리거 프로 시저의 리턴 값은 문자열 확인 또는 건너 뛰기 또는 '배열 get'에 의해 반환 된 목록 토토 캔 명령. 반환 값이 정상이면 정상 작업입니다 (삽입/업데이트/삭제)이 트리거를 해고 한 결과가 발생합니다. 분명히 Skip은 트리거 관리자에게 조용히 억제하도록 지시합니다 작전. 'Array Get'의 목록은 PL/토토 캔에 반환을 지시합니다 삽입 될 방아쇠 관리자에게 수정 된 행 $ 새로 제공되는 것 대신 (삽입/업데이트 만). 불필요한 이 모든 것이 방아쇠가있을 때만 의미가 있다고 말하는 것은 각 행 전후에.
여기에 작은 예제 트리거 절차가 있습니다 업데이트 수를 추적하기 위해 테이블의 정수 값 행에서 수행됩니다. 새 행이 삽입 된 경우 값이 있습니다 0으로 초기화 한 다음 모든 업데이트에서 증가합니다. 작업:
함수 만들기 trigfunc_modcount ()는 불투명 한 반환 ' 스위치 $ tg_op 삽입 새 ($ 1) 0을 설정하십시오 업데이트 새로 설정 ($ 1) $ old ($ 1) 새로운 새로운 ($ 1) 기본 OK를 반환합니다 반환 [배열이 새로워지기] '언어'pltcl '; 테이블 mytab 생성 (num int4, modcnt int4, description text); mytab에 삽입하거나 업데이트하기 전에 trigger trig_mytab_modcount를 만듭니다 각 행마다 실행 절차 trigfunc_modcount ( 'modcnt');
다음 명령은 데이터베이스에 액세스 할 수 있습니다 PL/TCL 절차의 본문에서 :
로그 메시지를 발사하십시오. 가능한 레벨은 통지, 오류, 치명적, 디버그 및 노인은elogC 함수.
단일 견적의 모든 발생을 복제합니다 백 슬래시 문자. 변수 일 때 사용해야합니다 에 주어진 쿼리 문자열에 사용됩니다.SPI_EXEC또는SPI_PREPARE(값 목록이 아님SPI_EXECP). 쿼리에 대해 생각하십시오 like
" '$ val'을 ret as"여기서 토토 캔 변수 val에는 실제로 "그렇지 않습니다". 이것 최종 쿼리 문자열을 초래할 것입니다
"선택 '하지 말아'ret '동안 구문 분석 오류가 발생합니다SPI_EXEC또는SPI_PREPARE. 포함해야합니다
"ret 'ret'
"선택 '[[QUOTE $ val]' 'AS RET"
쿼리는 Parser/Planner/Optimizer/Executor에 전화하십시오. 그만큼 선택적 -수수 값이SPI_EXEC최대 행 수 쿼리에 의해 처리.
쿼리가 select 문이고 선택 사항 인 경우 루프 바디 (foreach에서와 같은 TCL 명령의 본문 명령문)이 제공되면 각 행에 대해 평가됩니다 계속/break에서 예상되는 것처럼 선택되고 동작합니다. 그만큼 선택된 필드의 값은 열 이름. 그래서 A
SPI_EXEC "PG_PROC에서 CNT로 COUNT (*)를 선택하십시오변수 $ cnt를 PG_PROC 시스템 카탈로그. 옵션 -ARRAY가 제공되면 열이 있습니다 값은 '이름'이라는 이름의 연관 배열에 저장됩니다. 개별 변수 대신 열 이름.
SPI_EXEC -ARRAY C "선택 *에서 pg_class" Elog Debug "Table $ C (Relname)가 있습니다.PG_CLASS의 모든 행에 대한 디버그 로그 메시지를 인쇄합니다. 그만큼 반환 값SPI_EXEC는 수입니다 글로벌 변수에있는대로 쿼리의 영향을받는 행 spi_proced.
나중에 실행을위한 쿼리 계획을 준비하고 저장합니다. C 레벨 SPI_PREPARE와 약간 다릅니다. 계획은 자동으로 대구에 복사됩니다 메모리 컨텍스트. 따라서 현재는 방법이 없습니다 저장하지 않고 계획 준비.
쿼리가 인수를 참조하면 유형 이름이 있어야합니다 TCL 목록으로 제공됩니다. spi_prepare의 반환 값 후속 호출에서 사용되는 쿼리 ID입니다. spi_execp. 샘플은 spi_execp를 참조하십시오.
변수와 함께 SPI_PREPARE에서 준비된 계획을 실행합니다 치환. 선택적 -Count 값은 SPI_EXECP를 알려줍니다 처리 할 최대 행 수 질문.
-nulls의 선택적 값은 일련의 문자열입니다. 그리고 'n'문자는 spi_execp에게 어떤 값 중 어느 값을 알려줍니다 NULL입니다. 주어지면 정확히 길이가 있어야합니다 값의 수.
QueryId는 SPI_PREPARE가 반환 한 ID입니다 부르다.
SPI_PREPARE에 주어진 타이틀리스트가 있으면 TCL 정확히 같은 길이의 값 목록을 제공해야합니다. 쿼리 후 spi_execp에 유형이 켜진 경우 spi_prepare는 비어 있었고,이 주장은 생략되어야합니다.
쿼리가 SELECT 문인 경우 spi_exec에 대해 설명 된 루프 바디 및 선택된 필드의 변수.
다음은 a를 사용하는 PL/TCL 함수의 예입니다 준비된 계획 :
함수 만들기 t1_count (int4, int4)는 int4를 다시 반환합니다. ! [정보가 gd (plan)] 가 있다면 # 첫 번째 통화에 저장된 계획을 준비합니다 GD 설정 (계획) [SPI_PREPARE \\ "num = \\ $ 1, num <= \\ $ 2"\\에서 cnt로 cnt (*)를 선택하십시오. int4] SPI_EXECP -COUNT 1 $ gd (계획) [목록 $ 1 $ 2] $ CNT를 반환합니다 '언어'pltcl ';tcl이보아야 할 각 백 슬래시는 두 배가되어야합니다. 메인 파서가 프로세스하기 때문에 함수 생성 쿼리에서 생성 기능에도 백 슬래시. 주어진 쿼리 문자열 내부 SPI_PREPARE에게 매개 변수를 표시하려면 실제로 달러 표시가되어야합니다. 위치와 $ 1의 가치로 대체되지 않도록 첫 번째 기능 호출.
PL/토토 캔은 자주 사용되는 것들에 대한 특별한 지원을 가지고 있습니다. 그것 두 개의 마법 테이블 인 pl토토 캔_modules를 인식합니다 pl토토 캔_modfuncs. 이들이 존재하면 '알 수없는'모듈입니다 창조 직후 통역사에로드. 알려지지 않은 토토 캔 절차를 호출 할 때마다 알 수 없습니다 Proc은 절차가 1에 정의되어 있는지 확인하도록 요청받습니다. 모듈의. 이것이 사실이라면 모듈이로드됩니다 수요. 이 동작을 가능하게하려면 PL/토토 캔 호출 핸들러가 있습니다 -dpl토토 캔_unknown_support set로 컴파일해야합니다.
이러한 테이블을 유지할 수있는 지원 스크립트가 있습니다 PL/토토 캔 소스를 포함한 모듈 하위 디렉토리 설치 해야하는 알 수없는 모듈의 소스 처음에.