pl/사설 토토 사이트 언어로 함수를 만들려면 표준 구문
함수 만들기funcName(Argument-Types) 반환return-typeas ' # pl/사설 토토 사이트 기능 본문 '언어'pl사설 토토 사이트 ';
pl/사설 토토 사이트u는 언어가 있어야한다는 점을 제외하고 동일합니다. 로 지정'pl사설 토토 사이트u'.
함수의 본문은 단순히 TCL 스크립트의 조각입니다. 함수가 호출되면 인수 값은 다음과 같이 전달됩니다. 변수$ 1 ... $ n사설 토토 사이트 스크립트. 결과가 반환됩니다 일반적인 방식으로 사설 토토 사이트 코드에서 Areturn진술. 예를 들어, 함수 두 개의 정수 값을 반환하면 정의 될 수 있습니다. 처럼:
함수 만들기 tcl_max (정수, 정수) 정수를 반환합니다. if $ 1 $ 2 return $ 1 $ 2를 반환합니다 '언어'pltcl 'with (isstrict);
조항 참고with (isstrict), 널 입력 값에 대해 생각하지 않아도됩니다. 널이 전달되면 함수는 전혀 호출되지 않지만 자동으로 널 결과를 반환합니다.
인수의 실제 값 인 경우 비 스트릭 함수에서 NULL, 해당$ n변수 빈 문자열로 설정됩니다. 특정 지 여부를 감지합니다 인수는 null이고 함수 사용ArgisNull. 예를 들어, 우리가 원한다고 가정 해 봅시다 하나의 null과 하나의 비 널 인수가있는 사설 토토 사이트_max를 반환합니다. Null이 아닌 널 논쟁 :
함수 만들기 tcl_max (정수, 정수) 정수를 반환합니다. [ArgisNull 1] 인 경우 if [ArgisNull 2] return_null $ 2를 반환합니다 if [ArgisNull 2] return $ 1 if $ 1 $ 2 return $ 1 $ 2를 반환합니다 '언어'pltcl ';
위와 같이, pl/사설 토토 사이트에서 널 값을 반환하려면 함수, 실행return_null. 이것 함수가 엄격한 지 여부에 관계없이 수행 할 수 있습니다.
복합 유형 인수는 절차로 사설 토토 사이트로 전달됩니다 배열. 배열의 요소 이름은 속성 이름입니다. 복합 유형의. 전달 된 행의 속성이있는 경우 널 값은 배열에 나타나지 않습니다! 여기에 있습니다 오버 페이드 _2 함수를 정의하는 예 ( 구형PostgreSQL문서) PL/사설 토토 사이트 :
함수 생성 OverPaid_2 (EMP) BOOL을 반환합니다. if 200000.0 <$ 1 (급여) "T"반환 if $ 1 (Age) <30 && 100000.0 <$ 1 (Salary) "T"반환 "F"반환 '언어'pltcl ';
현재 반환에 대한 지원은 없습니다 복합 유형 결과 값
인수 값은 PL/사설 토토 사이트 기능의 스크립트에 제공됩니다 단순히 입력 인수는 텍스트 형식으로 변환됩니다 ( 그들이 선정 된 문으로 표시된 경우). 거꾸로, 그만큼return명령은 어떤 것을 수락합니다 함수에 대한 입력 형식 인 문자열 선언 된 반환 유형. 따라서 PL/사설 토토 사이트 프로그래머는 조작 할 수 있습니다 마치 텍스트 인 것처럼 데이터 값.
때로는 전역 상태 데이터를 갖는 것이 유용합니다. 절차에 대한 두 번의 전화 사이에서 보유되거나 사이에 공유됩니다. 다른 절차. 이것은 모든 PL/사설 토토 사이트 이후로 쉽게 수행됩니다 한 백엔드에서 실행 된 절차는 동일한 안전한 사설 토토 사이트을 공유합니다. 통역사. 따라서 모든 글로벌 사설 토토 사이트 변수는 모든 사람이 액세스 할 수 있습니다 pl/사설 토토 사이트 절차 호출 및 기간 동안 지속됩니다. SQL 클라이언트 연결. (PL/사설 토토 사이트U 기능은 기능합니다 마찬가지로 글로벌 데이터를 공유하지만 다른 사설 토토 사이트에 있습니다. 통역사 및 PL/사설 토토 사이트 기능과 통신 할 수 없습니다.)
의도하지 않게 PL/사설 토토 사이트 절차를 보호하는 데 도움이됩니다
서로 방해하면 글로벌 배열을 사용할 수 있습니다.
를 통해 각 절차에upvar
명령. 이 변수의 글로벌 이름은 절차입니다
내부 이름과 로컬 이름은gd. 권장됩니다gda의 개인 상태 데이터에 사용하십시오
절차. 값에 대해서만 일반 사설 토토 사이트 글로벌 변수를 사용하십시오
여러분이 여러 가지 중에서 공유하려고합니다
절차.
사용의 예gd그만큼SPI_EXECP
아래 예제.
다음 명령은 데이터베이스에 액세스 할 수 있습니다 PL/TCL 절차의 본문에서 :
SPI_EXEC
? -countn?
?-정렬이름?쿼리?루프 바디?문자열로 주어진 SQL 쿼리를 실행합니다. 오류 쿼리로 인해 오류가 발생합니다. 그렇지 않으면 명령의 반환 값은 처리 된 행 수입니다 (쿼리 별 선택, 삽입, 업데이트 또는 삭제) 또는 쿼리가 유틸리티 명령문 인 경우 0. 게다가, 쿼리가 select 문인 경우 선택된 열은 설명대로 TCL 변수에 배치됩니다 아래에.
선택 사항-count값
말하기SPI_EXEC
최대 값
쿼리에서 처리 할 행 수. 의 효과
이것은 쿼리를 커서로 설정하는 것과 비슷합니다.
그리고 말하기Fetch N.
쿼리가 select 문인 경우 SELECT의 결과 열은 TCL 변수에 배치됩니다 열에 이름을 따서 명명되었습니다. 인 경우-array옵션은 열 값입니다 대신 이름 지정된 연관 배열에 저장됩니다 배열 인덱스로 사용되는 선택 열 이름.
쿼리가 select 문이고 no루프 바디스크립트가 제공됩니다
첫 번째 결과 행 만 사설 토토 사이트에 저장됩니다.
변수; 나머지 행은 무시됩니다. 상점이 없습니다
SELECT가 행을 반환하지 않으면 발생합니다 (이 경우는 될 수 있습니다.
결과를 확인하여 감지SPI_EXEC
). 예를 들어,
SPI_EXEC "PG_PROC에서 CNT로 COUNT (*)를 선택하십시오
사설 토토 사이트 변수를 설정합니다$ cntpg_proc의 행 수로 시스템 카탈로그.
선택 사항 인 경우루프 바디인수가 제공됩니다 각 행에 대해 한 번 실행되는 사설 토토 사이트 스크립트 조각 선택 결과에서 (참고 :루프 바디주어진 경우 무시됩니다 쿼리는 선택이 아닙니다). 현재 행의 값 필드는 각각 전에 TCL 변수에 저장됩니다 반복. 예를 들어,
spi_exec -array c "select * from pg_class" Elog Debug "Table $ C (Relname)가 있습니다.
모든 행에 대한 디버그 로그 메시지를 인쇄합니다. pg_class. 이 기능은 다른 사설 토토 사이트과 유사하게 작동합니다 구조물 루핑; 특히계속andbreak내부의 일반적인 방식으로 작업하십시오 루프 바디.
선택 결과의 필드가 NULL 인 경우 대상 변수"Unset"설정되지 않고.
SPI_PREPARE
쿼리 typelist나중에 실행을위한 쿼리 계획을 준비하고 저장합니다. 저장된 계획은 현재 백엔드.
쿼리가 사용할 수 있습니다인수, 이는 언제든지 값을 공급할 자리 표시 자입니다 계획은 실제로 실행됩니다. 쿼리 문자열에서 참조하십시오 상징에 의한 논쟁$ 1 ... $ n. 쿼리가 사용되는 경우 인수, 인수 유형의 이름은 주어져야합니다. TCL 목록으로. (빈 목록 작성typelist인수가 사용되지 않은 경우.) 현재, 인수 유형은 pg_type에 표시된 내부 유형 이름; 예를 들어int4notInteger.
반환 값SPI_PREPARE
사용되는 쿼리 ID입니다
후속 전화SPI_EXECP
. 보다SPI_EXECP
예를 들어.
SPI_EXECP
? -countn?
?-정렬이름? ? -nullsString?QueryId?Value-List? ?루프 바디?이전에 준비한 쿼리 실행SPI_PREPARE
. QueryIdid는SPI_PREPARE
. 쿼리 인 경우
참고 문헌, AValue-List제공해야합니다
인수에 대한 실제 값의 TCL 목록입니다. 이것
인수 유형 목록과 같은 길이 여야합니다.
이전에SPI_PREPARE
. 생략Value-List쿼리에 없음이없는 경우
논쟁.
선택적 값-nulls공백의 문자열 및16999_17004캐릭터 텔링SPI_EXECP
논쟁 중 어느 것입니다
널. 주어진 경우, 그것은 정확히 같은 길이를 가져야합니다.
그만큼Value-List. 그렇다면
주어지지 않음, 모든 인수 값은 널이 아닙니다.
쿼리와 그 방식을 제외하고
인수가 지정되어 있습니다.SPI_EXECP
SPI_EXEC
. 그만큼-count, -array,
그리고루프-바디옵션은입니다
동일하고 결과 값도 마찬가지입니다.
a를 사용하는 PL/TCL 함수의 예는 다음과 같습니다 준비된 계획 :
함수 만들기 t1_count (정수, 정수) 정수를 반환합니다. ! [정보가 gd (plan)] 가 있다면 # 첫 번째 통화에 저장된 계획을 준비합니다 GD 설정 (계획) [SPI_PREPARE \\ "num = \\ $ 1, num <= \\ $ 2"\\에서 cnt로 cnt (*)를 선택하십시오. [List Int4 Int4]] SPI_EXECP -COUNT 1 $ gd (계획) [목록 $ 1 $ 2] $ CNT를 반환합니다 '언어'pltcl ';
tcl이보아야 할 각 백 슬래시는
메인 이후로 기능을 입력 할 때 두 배
파서는 생성 기능에서 백 슬래시도 처리합니다. 우리
주어진 쿼리 문자열 내부에 백 슬래시가 필요합니다SPI_PREPARE
그만큼$ n마커가 전달됩니다
까지SPI_PREPARE
as-is, 그리고 사설 토토 사이트 변수 대체로 대체되지 않았습니다.
spi_lastoid
마지막으로 삽입 된 행의 OID를 반환합니다SPI_EXEC
'd 또는SPI_EXECP
'd 쿼리, 해당 쿼리 인 경우
단일 줄 삽입. (그렇지 않으면 0이됩니다.)
QUOTE
String단일 견적의 모든 발생을 복제합니다
주어진 문자열의 백 슬래시 문자. 이것은 될 수 있습니다
안에 삽입 될 줄을 안전하게 인용하는 데 사용됩니다.
주어진 SQL 쿼리SPI_EXEC
또는SPI_PREPARE
. 예를 들어, a에 대해 생각하십시오
쿼리 문자열
" '$ val'을 ret as"
사설 토토 사이트 변수 VAL에 실제로 포함 된 여기서그렇지 않음. 결과가 발생합니다 최종 쿼리 문자열
선택한 'do n't'as as ret
이 동안 구문 분석 오류가 발생합니다SPI_EXEC
또는SPI_PREPARE
20116_20164
선택한 'dos n't'as ret
pl/사설 토토 사이트에서 as를 형성 할 수 있습니다.
" '[QUOTE $ val]' 'AS RET" 선택
하나의 이점SPI_EXECP
당신은 필요하지 않습니다
인용 인용 인수 값은 인수가 있기 때문입니다
SQL 쿼리 문자열의 일부로 구문 분석하지 마십시오.
elog
레벨 MSG로그 또는 오류 메시지를 방출합니다. 가능한 레벨은디버그, 통지, 오류, 그리고치명적. 디버그and통지주어진 메시지를 우체국 마스터 로그에 방출합니다 (그리고의 경우에도 클라이언트에게도 보내십시오통지).오류오류 조건을 제기합니다 기능은 버려지고 현재 거래는 다음과 같습니다 중단.치명적거래 및 현재 백엔드가 종료되게합니다 (이 오류 수준을 사용해야 할 이유가 없을 것입니다. PL/TCL 기능에서는 제공됩니다 완전성).
트리거 절차는 pl/사설 토토 사이트로 작성할 수 있습니다. 관례와 마찬가지로 안에PostgreSQL, 절차 트리거라고 불리는 것은 함수로 선언해야합니다. 논쟁이없고 반환 유형의opaque.
트리거 관리자의 정보가 전달됩니다. 다음 변수의 절차 본문 :
생성 트리거에서 트리거의 이름 성명.
트리거를 일으킨 테이블의 객체 ID 호출 절차.
테이블 필드 이름의 tcl 목록,
빈 목록 요소. 그래서 요소 이름을 찾고 있습니다
TCL의 목록lsearch
명령은 요소 번호를 1로 시작합니다
첫 번째 열은 필드와 같은 방식으로 관습 적으로
번호PostgreSQL.
문자열전또는이후유형에 따라 트리거 콜.
문자열Row또는진술트리거 유형에 따라 부르다.
문자열삽입, 업데이트또는삭제트리거 호출 유형에 따라
새로운 값을 포함하는 연관 배열 삽입/업데이트 작업의 테이블 행 또는 삭제를 위해 비어 있습니다. 배열은 필드 이름으로 색인됩니다. 무인 필드 배열에 나타나지 않습니다!
오래된 값을 포함하는 연관 배열 업데이트/삭제 작업의 테이블 행 또는 삽입 용 비어 있습니다. 배열은 필드 이름으로 색인됩니다. 무인 필드 배열에 나타나지 않습니다!
주어진 절차에 대한 인수의 tcl 목록 생성 트리거 문에서. 이러한 주장도 있습니다 액세스 가능$ 1 ... $ n절차 기관에서.
트리거 프로 시저의 리턴 값은 문자열OK또는skip또는에 의해 반환 된 목록배열 gettcl 명령. 반환 값이 인 경우OK, 작업 (삽입/업데이트/삭제) 트리거를 발사 한 결과 진행됩니다 보통.건너 뛰기트리거를 알려줍니다 관리자는이 행의 작업을 조용히 억제합니다. 경우 a 목록이 반환됩니다. PL/TCL에 수정 된 행을 하나 대신 삽입 될 트리거 관리자 $ 새로 제공됩니다 (이것은 삽입/업데이트에만 적용). 필요하지 않습니다 이 모든 것이 방아쇠가 이전에있을 때만 의미가 있다고 말합니다. 그리고 각 행에 대해; 그렇지 않으면 반환 값이 무시됩니다.
여기에 작은 예제 트리거 절차가 있습니다 업데이트 수를 추적하기 위해 테이블의 정수 값 행에서 수행됩니다. 새 행이 삽입 된 경우 값이 있습니다 0으로 초기화 한 다음 모든 업데이트에서 증가합니다. 작업:
함수 만들기 trigfunc_modcount () opaque as '를 반환합니다. 스위치 $ tg_op 삽입 새 ($ 1) 0을 설정하십시오 업데이트 새로 설정 ($ 1) $ old ($ 1) 새로운 새로운 ($ 1) 기본 OK를 반환합니다 반환 [배열이 새로워지기] '언어'pltcl '; 테이블 마이 타브 생성 (Num Integer, Description Text, Modcnt Integer); mytab에 삽입하거나 업데이트하기 전에 trigger trig_mytab_modcount를 만듭니다 각 행마다 실행 절차 trigfunc_modcount ( 'modcnt');
트리거 절차 자체가 열 이름; 그것은 트리거 인수에서 제공됩니다. 이것 트리거 절차를 다른 것으로 재사용 할 수 있습니다 테이블.
알 수없는
명령PL/사설 토토 사이트은 사용시 자동로드 사설 토토 사이트 코드를 지원합니다. 그것 특별 테이블을 인식합니다.pl사설 토토 사이트_modules사설 토토 사이트 코드 모듈. 이 테이블이 있으면 모듈알 수없는테이블에서 가져 왔습니다 생성 직후에 사설 토토 사이트 통역사에로드 됨 통역사.
알 수없는모듈 실제로 필요한 초기화 스크립트가 포함되어 있습니다 일반적으로 사설 토토 사이트을 정의합니다"알 수없는"TCL이 인식하지 않을 때마다 호출되는 절차 절차 이름을 호출했습니다. PL/TCL의 표준 버전 절차는에서 모듈을 찾으려고합니다.pl사설 토토 사이트_modules필요한 것을 정의합니다 절차. 발견되면 통역사에로드됩니다. 그런 다음 실행이 원래를 진행할 수 있습니다. 시도 된 절차 호출. 보조 테이블pl사설 토토 사이트_modfuncs그 인덱스를 제공합니다 기능은 모듈에 의해 정의되므로 조회가 합리적으로 빠릅니다.
thePostgreSQL분포 이 테이블을 유지하기위한 지원 스크립트가 포함되어 있습니다.pl사설 토토 사이트_loadmod, pl사설 토토 사이트_listmod, pl사설 토토 사이트_delmod및 표준 소스 알 수없는 모듈share/unknown.pl사설 토토 사이트. 이 모듈은 처음에 각 데이터베이스에로드해야합니다. 자동로드 메커니즘을 지원합니다.
테이블pl사설 토토 사이트_modules및pl사설 토토 사이트_modfuncs읽을 수 있어야합니다 모두, 그러나 그들에게만 소유하고 글을 쓰는 것이 현명합니다. 데이터베이스 관리자.
inPostgreSQL, 하나와 동일한 기능 이름은 다른 기능에 사용될 수 있습니다. 인수의 수 또는 유형이 다르기 때문에. 그러나 TCL, 모든 절차 이름이 구별되어야합니다. PL/TCL은 처리합니다 내부 TCL 절차 이름에 프로 시저의 PG_PROC 행의 객체 ID 이름의 일부로. 따라서,PostgreSQL함수 같은 이름과 다른 인수 유형을 가진 다른 TCL 절차도. 이것은 일반적으로 우려가 아닙니다 PL/TCL 프로그래머의 경우 디버깅.