이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

25.2. 설명

25.2.1. 포스트그레스함수와 토토 캔 프로시저 이름

포스트그레, 하나와 동일한 함수 이름을 다른 함수에 사용할 수 있습니다. 인수의 수나 유형이 다르기 때문입니다. 이것은 토토 캔 프로시저 이름과 충돌합니다. 동일한 유연성을 제공하기 위해 PL/토토 캔에서 내부 토토 캔 프로시저 이름에는 객체가 포함됩니다. 이름의 일부인 프로시저의 pg_proc 행 ID입니다. 따라서, 동일한 argtype 버전이 다름포스트그레스함수는 토토 캔에 대해 다릅니다. 너무.

25.2.2. PL/토토 캔에서 함수 정의

PL/Tcl 언어로 함수를 생성하려면 다음을 사용하십시오. 표준 구문

함수 생성기능 이름 (인수 유형) 반환반환 유형AS '
    # PL/토토 캔 함수 본문
' 언어 'pl토토 캔';
함수가 호출되면 인수는 다음과 같이 제공됩니다. 변수$1 ... $n토토 캔 프로시져 본문에. 결과가 반환됩니다. 일반적인 방법으로 토토 캔 코드에서 a반환성명. 예를 들어, 반환하는 함수 두 개의 int4 값 중 더 높은 값은 다음과 같이 정의될 수 있습니다.
함수 생성 tcl_max (int4, int4)는 int4를 '로 반환합니다.
    if $1  $2 $1 반환
    2달러를 돌려주다
' 언어 'pltcl';
PL/Tcl 함수에서 NULL 값을 반환하려면 다음을 실행하세요.return_null.

복합 유형 인수는 Tcl로 프로시저에 제공됩니다. 배열. 배열의 요소 이름은 속성 이름입니다. 복합형이다. 실제 행의 속성에 다음이 있는 경우 NULL 값은 배열에 나타나지 않습니다! 여기는 overpaid_2 함수를 정의하는 예( 나이가 많은포스트그레문서) PL/Tcl에서

CREATE FUNCTION overpaid_2 (EMP) RETURNS bool AS '
    if 200000.0 < $1(급여) 
        "t"를 반환

    if $1(연령) < 30 && 100000.0 < $1(급여) 
        "t"를 반환

    "f"를 반환
' 언어 'pltcl';

25.2.3. PL/토토 캔의 전역 데이터

때때로(특히 설명된 SPI 기능을 사용할 때) 나중에) 전역 상태 데이터를 갖는 것이 유용합니다. 프로시저에 대한 두 번의 호출 사이에 유지됩니다. 이것은 쉽게 이루어집니다 하나의 백엔드에서 실행되는 모든 PL/토토 캔 프로시저는 동일한 안전한 토토 캔 해석기.

원치 않는 측면으로부터 PL/토토 캔 절차를 보호하기 위해 효과를 통해 각 프로시저에 배열을 사용할 수 있습니다. upvar 명령. 이 변수의 전역 이름은 프로시저의 내부 이름은 GD입니다. 그것은 개인 상태 데이터에는 GD를 사용하는 것이 좋습니다. 절차. 값에만 일반 토토 캔 전역 변수를 사용하십시오. 귀하가 특별히 여러 사람과 공유하려는 의도가 있는 것 절차.

25.2.4. PL/토토 캔의 트리거 절차

트리거 절차는 다음에서 정의됩니다.포스트그레스인수 없는 함수로 반환 유형은 opaque입니다. PL/Tcl에도 마찬가지입니다. 언어.

트리거 관리자의 정보는 다음에게 전달됩니다. 다음 변수의 프로시저 본문:

$TG_name

CREATE TRIGGER의 트리거 이름 진술.

$TG_relid

트리거를 발생시킨 테이블의 개체 ID 호출할 프로시저입니다.

$TG_relatts

접두사가 붙은 테이블 필드 이름의 Tcl 목록 빈 목록 요소. 따라서 요소 이름을 검색하면 lsearch Tcl 명령을 사용한 목록은 동일한 결과를 반환합니다. 필드는 1부터 시작하는 양수입니다. pg_attribute 시스템 카탈로그에 번호가 매겨져 있습니다.

$TG_when

이벤트에 따른 BEFORE 또는 AFTER 문자열 트리거 호출.

$TG_level

이벤트에 따른 문자열 ROW 또는 STATEMENT 트리거 호출.

$TG_op

문자열은 다음에 따라 INSERT, UPDATE 또는 DELETE 트리거 호출 이벤트입니다.

$NEW

다음의 새 테이블 행 값을 포함하는 배열 INSERT/UPDATE 작업 또는 DELETE 시 비어 있습니다.

$OLD

다음의 이전 테이블 행 값을 포함하는 배열 UPDATE/DELETE 작업 또는 INSERT 시 비어 있습니다.

$GD

위에 설명된 전역 상태 데이터 배열입니다.

$args

주어진 프로시저에 대한 인수의 Tcl 목록 CREATE TRIGGER 문에서. 주장은 또한 프로시저 본문에서 $1 ... $n으로 액세스할 수 있습니다.

트리거 프로시저의 반환 값은 다음 중 하나입니다. 문자열 OK 또는 SKIP, 또는 'array get'에 의해 반환된 목록 Tcl 명령. 반환 값이 OK이면 정상 작동 이 트리거를 실행한 (INSERT/UPDATE/DELETE)이 발생합니다. 분명히 SKIP은 트리거 관리자에게 자동으로 억제하라고 지시합니다. 작업. 'array get'의 목록은 PL/Tcl에게 반환을 지시합니다. 삽입될 트리거 관리자에 대한 수정된 행 $NEW에 제공된 것 대신(INSERT/UPDATE에만 해당) 불필요한 이 모든 것은 트리거가 실행될 때만 의미가 있다고 말할 수 있습니다. 각 행의 앞과 뒤에.

여기에 강제로 실행하는 트리거 절차의 작은 예가 있습니다. 업데이트 횟수를 추적하기 위한 테이블의 정수 값 행에서 수행되는 것입니다. 새 행이 삽입된 경우 값 0으로 초기화된 다음 업데이트할 때마다 증가합니다. 작업:

함수 생성 trigfunc_modcount()는 불투명한 값을 '로 반환합니다.
    $TG_op 전환 
        삽입 
            신규 설정($1) 0

        업데이트 
            새로운 설정($1) $OLD($1)
            신규($1) 증가

        기본값 
            반품 확인

    반환 [배열 새로 가져오기]
' 언어 'pltcl';

CREATE TABLE mytab (num int4, modcnt int4, 설명 텍스트);

mytab에 삽입하거나 업데이트하기 전에 트리거 trig_mytab_modcount를 생성하세요.
    각 행 실행 절차에 대해 trigfunc_modcount('modcnt');

25.2.5. PL/토토 캔에서 데이터베이스 액세스

다음 명령을 사용하여 데이터베이스에 액세스할 수 있습니다 PL/Tcl 프로시저 본문에서:

elog레벨 msg

로그 메시지를 실행합니다. 가능한 수준은 NOTICE, ERROR, FATAL, DEBUG 및 NOIND는elogC 함수.

인용문문자열

작은따옴표 및 백슬래시 문자. 변수가 있을 때 사용해야 합니다. 에 제공된 쿼리 문자열에 사용됩니다.spi_exec또는spi_prepare(다음 값 목록에는 해당되지 않음spi_execp). 쿼리를 생각해 보세요 같은 문자열

"ret '$val' AS 선택"
Tcl 변수 val에는 실제로 "하지 않음"이 포함되어 있습니다. 이 최종 쿼리 문자열이 생성됩니다.
"SELECT는 '재실행'하지 않습니다."
이 과정에서 구문 분석 오류가 발생합니다.spi_exec또는spi_prepare. 다음을 포함해야 합니다.
"다시 선택하면 '하지 않음'을 선택합니다."
다음과 같이 작성되어야 합니다
"SELECT '[ quote $val ]' AS ret"
spi_exec ?-countn? ?-배열이름? 질의 ?루프-본문?

질의를 위해 파서/플래너/옵티마이저/실행기를 호출합니다. 는 선택적 -count 값이 알려줍니다.spi_exec최대 행 수 쿼리에 의해 처리됩니다.

쿼리가 SELECT 문이고 선택 사항인 경우 loop-body(foreach와 같은 Tcl 명령 본문) 문)이 주어지면 각 행에 대해 평가됩니다. 선택되어 계속/중단 시 예상대로 작동합니다. 는 선택한 필드의 값은 다음과 같은 변수에 저장됩니다. 열 이름. 그래서

spi_exec "SELECT count(*) AS cnt FROM pg_proc"
변수 $cnt를 다음의 행 수로 설정합니다. pg_proc 시스템 카탈로그. -array 옵션이 제공되면 해당 열은 값은 다음에 의해 인덱싱된 'name'이라는 연관 배열에 저장됩니다. 개별 변수 대신 열 이름입니다.
spi_exec -array C "SELECT * FROM pg_class" 
    elog DEBUG "테이블 $C(relname) 있음"
pg_class의 모든 행에 대해 DEBUG 로그 메시지를 인쇄합니다. 는 반환 값spi_exec수는 전역 변수에서 발견된 쿼리의 영향을 받는 행 SPI_처리되었습니다.
spi_prepare질의 유형 목록

나중 실행을 위해 쿼리 계획을 준비하고 저장합니다. C 레벨 SPI_prepare와는 약간 다릅니다. 계획이 자동으로 최상위 레벨에 복사됩니다. 메모리 컨텍스트. 따라서 현재는 방법이 없습니다 저장하지 않고 계획을 준비 중입니다.

쿼리가 인수를 참조하는 경우 유형 이름은 다음과 같아야 합니다. Tcl 목록으로 제공됩니다. spi_prepare의 반환 값 후속 호출에 사용되는 쿼리 ID입니다. spi_execp. 샘플은 spi_execp를 참조하세요.

spi_exec ?-countn? ?-배열이름? ?-널문자열? 쿼리ID ?값 목록? ?루프-본문?

변수를 사용하여 spi_prepare에서 준비된 계획을 실행합니다. 대체. 선택적 -count 값은 spi_execp를 알려줍니다. 처리할 최대 행 수 쿼리.

-nulls의 선택적 값은 공백 문자열입니다. 및 spi_execp에 어떤 값을 알려주는 'n' 문자 NULL입니다. 주어진 경우, 길이는 정확히 다음과 같아야 합니다. 값의 개수입니다.

queryid는 spi_prepare에 의해 반환된 ID입니다. 전화해.

spi_prepare에 제공된 유형 목록이 있는 경우 Tcl 정확히 같은 길이의 값 목록이 제공되어야 합니다. 쿼리 후 spi_execp에. 유형 목록에 있는 경우 spi_prepare가 비어 있으므로 이 인수를 생략해야 합니다.

쿼리가 SELECT 문인 경우 다음과 같습니다. spi_exec에 대해 설명된 내용은 루프 본문에 대해 발생하며 선택한 필드에 대한 변수입니다.

다음은 다음을 사용하는 PL/Tcl 함수의 예입니다. 준비된 계획:

함수 생성 t1_count(int4, int4)는 int4를 '로 반환합니다.
    if ![ 정보가 존재하는 경우 GD(plan) ] 
        # 첫 번째 호출에서 저장된 계획을 준비합니다.
        GD 설정(계획) [ spi_prepare \\
                "SELECT count(*) AS cnt FROM t1 WHERE num = \\$1 AND num <= \\$2" \\
                정수4]

    spi_execp -count 1 $GD(계획) [ 목록 $1 $2 ]
    $cnt 반환
' 언어 'pltcl';
Tcl이 봐야 하는 각 백슬래시는 두 배로 늘어나야 한다는 점에 유의하세요. 함수를 생성하는 쿼리에서 기본 파서가 처리하기 때문에 CREATE FUNCTION에서도 백슬래시를 사용합니다. 주어진 쿼리 문자열 내부 spi_prepare는 실제로 매개변수를 표시하는 달러 기호여야 합니다. $1이 주어진 값으로 대체되지 않도록 첫 번째 함수 호출입니다.
모듈 및 알 수 없는 명령

PL/Tcl은 자주 사용되는 것에 대한 특별한 지원을 제공합니다. 그것 두 개의 매직 테이블인 pltcl_modules를 인식하고 pltcl_modfuncs. 이것이 존재하는 경우 'unknown' 모듈은 생성 직후 인터프리터에 로드됩니다. 알려지지 않은 Tcl 프로시저가 호출될 때마다 알려지지 않은 proc은 프로시저가 하나에 정의되어 있는지 확인하라는 요청을 받습니다. 모듈의. 이것이 사실이라면 모듈은 다음에 로드됩니다. 수요. 이 동작을 활성화하려면 PL/Tcl 호출 핸들러 -DPLTCL_UNKNOWN_SUPPORT 세트를 사용하여 컴파일해야 합니다.

이러한 테이블을 유지 관리하는 지원 스크립트가 있습니다. 다음을 포함하는 PL/Tcl 소스의 모듈 하위 디렉터리 설치해야 하는 알 수 없는 모듈의 소스 처음에는.