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

PL/스포츠 토토

PL/스포츠 토토은 로드 가능한 절차 언어입니다.포스트그레스스포츠 토토을 활성화하는 데이터베이스 시스템 함수 및 트리거 절차를 만드는 데 사용되는 언어입니다.

이 패키지는 원래 Jan Wieck에 의해 작성되었습니다.

개요

PL/스포츠 토토은 함수 작성자가 갖고 있는 대부분의 기능을 제공합니다. 일부 제한사항을 제외하고는 C 언어입니다.

좋은 제한은 모든 것이 금고에서 실행된다는 것입니다 스포츠 토토 해석기. 제한된 명령 세트 외에도 안전 스포츠 토토을 통해 데이터베이스에 액세스하는 데 몇 가지 명령만 사용할 수 있습니다. SPI 및 elog()를 통해 메시지를 발생시킵니다. 접근할 수 있는 방법이 없습니다 데이터베이스 백엔드 내부 또는 OS 수준 액세스 권한 획득 의 권한은포스트그레C와 같은 사용자 ID입니다. 따라서 권한이 없는 데이터베이스 사용자는 이 언어를 사용하는 것이 허용됩니다.

다른 내부 제한 사항은 스포츠 토토 절차입니다. 새 데이터에 대한 입력/출력 기능을 생성하는 데 사용할 수 없습니다. 유형.

PL/스포츠 토토 호출 처리기를 위한 공유 객체는 자동으로 에 구축 및 설치됨포스트그레스Tcl/Tk인 경우 라이브러리 디렉토리 지원은 설치 구성 단계에서 지정됩니다. 절차.

설명

포스트그레스함수 및 스포츠 토토 절차 이름

포스트그레스, 하나이고 똑같음 함수 이름은 다음과 같은 한 다른 함수에 사용될 수 있습니다. 인수 개수나 유형이 다릅니다. 이것은 다음과 충돌할 것이다. Tcl 프로시저 이름. PL/스포츠 토토에서 동일한 유연성을 제공하기 위해 내부 Tcl 프로시저 이름에는 프로시저 pg_proc 행을 이름의 일부로 포함합니다. 따라서, 다른 동일한 argtype 버전포스트그레스함수는 스포츠 토토에 대해 다릅니다. 너무.

정의 PL/스포츠 토토의 기능

PL/스포츠 토토 언어로 함수를 생성하려면 알려진 구문

함수 생성기능 이름 (인수 유형) 반환반환 유형AS '
        # PL/스포츠 토토 함수 본문
    ' 언어 'pltcl';
쿼리에서 이 함수를 호출할 때 인수는 다음과 같습니다. Tcl 프로시저 본문에 변수 $1 ... $n으로 제공됩니다. 그래서 조금 두 개의 int4 값 중 더 높은 값을 반환하는 max 함수는 다음과 같습니다. 다음과 같이 생성되었습니다:
함수 생성 tcl_max (int4, int4)는 int4를 '로 반환합니다.
        if $1  $2 $1 반환
        2달러를 돌려주다
    ' 언어 'pltcl';
복합 유형 인수는 프로시저에 Tcl로 제공됩니다. 배열. 배열의 요소 이름은 다음의 속성 이름입니다. 복합형. 실제 행의 속성에 NULL이 있는 경우 값이 없으면 배열에 표시되지 않습니다! 여기에 그 예가 있습니다. overpaid_2 함수를 정의합니다(이전 버전에서 발견됨)포스트그레8350_8378
CREATE FUNCTION overpaid_2 (EMP) RETURNS bool AS '
        if 200000.0 < $1(급여) 
            "t"를 반환

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

        "f"를 반환
    ' 언어 'pl스포츠 토토';

글로벌 데이터 PL/스포츠 토토

때때로(특히 설명된 SPI 기능을 사용할 때) 나중에) 일부 전역 상태 데이터를 보유하는 것이 유용합니다. 프로시저에 대한 두 호출 사이. 모든 PL/스포츠 토토 프로시저는 다음에서 실행됩니다. 하나의 백엔드는 동일한 안전한 Tcl 인터프리터를 공유합니다. 보호하는 데 도움을 주기 위해 PL/스포츠 토토 절차의 부작용으로 인해 어레이를 사용할 수 있게 되었습니다. upvar 명령을 통해 각 절차를 수행합니다. 이것의 글로벌 이름은 변수는 프로시저 내부 이름이고 로컬 이름은 GD.

트리거 PL/스포츠 토토의 절차

트리거 절차는 다음에 정의되어 있습니다.포스트그레스인수 및 a가 없는 함수로 반환 유형은 불투명입니다. PL/스포츠 토토 언어에도 마찬가지입니다.

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

$TG_name

CREATE TRIGGER의 트리거 이름 진술.

$TG_relid

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

$TG_relatts

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

$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/스포츠 토토에게 다음을 반환하라고 지시합니다. 대신 삽입될 트리거 관리자에 대한 수정된 행 $NEW에 제공된 것 중 하나입니다(INSERT/UPDATE에만 해당). 말할 것도 없이 이 모든 것은 트리거가 BEFORE 및 FOR EACH인 경우에만 의미가 있습니다. 행.

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

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

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

            기본값 
                반품 확인

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

    CREATE TABLE mytab(num int4, modcnt int4, desc text);

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

데이터베이스 액세스 PL/스포츠 토토에서

다음 명령은 다음에서 데이터베이스에 액세스하는 데 사용할 수 있습니다. PL/스포츠 토토 프로시저의 본문:

elog레벨 msg

로그 메시지를 실행합니다. 가능한 수준은 NOTICE, WARN, ERROR입니다. elog() C 함수와 같은 FATAL, DEBUG 및 NOIND.

인용문문자열

작은따옴표와 백슬래시가 있는 모든 항목을 복제합니다. 문자. 변수를 사용할 때 사용해야 합니다. 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_processed에서 발견되었습니다.
spi_prepare질의 유형 목록

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

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

spi_exec ?-countn? ?-배열이름? ?-널str? 질의 ?값 목록? ?루프-본문?

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

-nulls의 선택적 값은 공백과 'n'으로 구성된 문자열입니다. spi_execp에 어떤 값이 NULL인지 알려주는 문자입니다. 만약에 주어진 경우, 그것은 숫자의 길이와 정확히 같아야 합니다. 값.

queryid는 spi_prepare 호출에서 반환된 ID입니다.

spi_prepare에 제공된 유형 목록이 있는 경우 다음의 Tcl 목록 정확히 동일한 길이의 값을 spi_execp에 제공해야 합니다. 쿼리 후. spi_prepare의 유형 목록이 비어 있는 경우 이 인수는 생략되어야 합니다.

쿼리가 SELECT 문인 경우 설명과 동일 for spi_exec는 루프 본문과 변수에 대해 발생합니다. 선택한 필드입니다.

다음은 준비된 PL/스포츠 토토 함수에 대한 예입니다. 계획:

함수 생성 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/스포츠 토토은 자주 사용되는 것에 대한 특별한 지원을 제공합니다. 그것 두 개의 매직 테이블 pltcl_modules 및 pltcl_modfuncs를 인식합니다. 이것이 존재하는 경우 'unknown' 모듈이 생성 직후 통역사. 알 수 없는 Tcl이 나타날 때마다 프로시저가 호출되면 알 수 없는 프로시저가 절차는 모듈 중 하나에 정의되어 있습니다. 이것이 사실이라면, 모듈은 요청 시 로드됩니다. 이 동작을 활성화하려면 PL/스포츠 토토 호출 처리기는 다음으로 컴파일되어야 합니다. -DPLTCL_UNKNOWN_SUPPORT가 설정되었습니다.

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