다음에 사용된 모든 토토 결과PL/pgSQL문은 다음을 사용하여 처리됩니다. 서버의 일반SQL집행자. 상수를 포함하는 것처럼 보이는 토토 결과식에는 실제로 다음이 필요할 수 있습니다. 런타임 평가(예:'지금'에 대한타임스탬프유형) 따라서 불가능합니다.PL/pgSQL실제 식별을 위한 파서 키워드 이외의 상수 값NULL. 모든 토토 결과식은 내부적으로 다음과 같이 평가됩니다. 쿼리 실행 중
선택토토 결과
다음을 사용하여SPI관리자. 에 대한 평가, 발생PL/pgSQL변수 식별자가 대체됩니다. 매개변수별로, 변수의 실제 값은 다음과 같습니다. 매개변수 배열의 실행자에게 전달됩니다. 이를 통해 에 대한 쿼리 계획선택준비중 한 번만 사용한 후 후속 평가에 재사용됩니다.
에 의해 수행된 평가포스트그레SQL주 파서에는 몇 가지 부작용이 있습니다 상수 값의 해석에 관한 것입니다. 자세하게는 이 두 함수가 수행하는 작업의 차이점은 다음과 같습니다.
CREATE FUNCTION logfunc1(text) RETURNS 타임스탬프 AS '
선언
$1에 대한 logtxt 별칭;
시작
INSERT INTO 로그 테이블 VALUES(logtxt, ''now'');
RETURN ''지금'';
끝;
' 언어 plpgsql;
그리고
CREATE FUNCTION logfunc2(text) RETURNS 타임스탬프 AS '
선언
$1에 대한 logtxt 별칭;
curtime 타임스탬프;
시작
curtime := ''지금'';
INSERT INTO 로그 테이블 VALUES(logtxt, curtime);
복귀 시간;
끝;
' 언어 plpgsql;
다음의 경우logfunc1, 그PostgreSQL메인 파서는 알고 있습니다
계획을 준비할 때삽입,
그 문자열'지금'해야 합니다
다음과 같이 해석됨타임스탬프왜냐하면 목표가
열로그 테이블그거요
유형. 따라서 이 시점에서 상수를 만들 것입니다.
그런 다음 상수 값은 모든 호출에 사용됩니다.logfunc1세션 수명 동안.
이것은 프로그래머가 원하는 것이 아니라는 것은 말할 필요도 없습니다.
다음의 경우logfunc2, 그PostgreSQL주 파서는 그렇지 않습니다
어떤 유형인지 알아요'지금'이 되어야 하며
따라서 유형의 데이터 값을 반환합니다.텍스트문자열 포함지금. 이후 현지 임무를 수행하는 동안
변수커타임, 그PL/pgSQL인터프리터는 이 문자열을 다음으로 변환합니다.타임스탬프다음을 호출하여 입력text_out그리고timestamp_in변환을 위한 함수. 그래서,
계산된 타임스탬프는 실행될 때마다 업데이트됩니다.
프로그래머는 기대합니다.
레코드 변수의 변경 가능 특성으로 인해 문제가 발생합니다. 이 연결. 레코드 변수의 필드가 사용되는 경우 토토 결과식 또는 명령문에서 필드의 데이터 유형은 하나의 호출과 동일한 토토 결과식 사이의 변경 토토 결과식은 존재하는 데이터 유형을 사용하여 계획됩니다. 토토 결과식에 처음 도달할 때. 그럴 때 이 점을 명심하세요. 둘 이상의 이벤트를 처리하는 트리거 프로시저 작성 테이블. (실행다음을 얻는 데 사용할 수 있습니다. 필요한 경우 이 문제를 해결하세요.)