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