Postgresql 9.2.24 문서화 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.2 : 와이즈 토토 프로 시저 | up | 39 장.스포츠 토토/pgsql - SQL절차 언어 | 다음 |
이 섹션에서는 일부 구현 세부 정보에 대해 설명합니다 자주스포츠 토토/pgsql사용자가 알고 있습니다.
a 내 SQL 문 및 표현식스포츠 토토/pgsql함수는 변수를 참조 할 수 있습니다 및 함수의 매개 변수. 무대 뒤에서스포츠 토토/pgsql쿼리 매개 변수를 대체합니다 그러한 참조. 매개 변수는 장소에서만 대체됩니다 파라미터 또는 열 참조가 구문 적으로 허용되는 경우. 극단적 인 경우, 열악한 프로그래밍의 예를 고려하십시오. 스타일:
foo (foo) 값 (foo)에 삽입;
첫 번째 발생foo필수 구문 적으로 테이블 이름이므로 대체되지 않습니다. 함수의 변수가가 있더라도foo. 두 번째 발생은 a의 이름이어야합니다 테이블의 열이므로 대체되지 않습니다. 오직 세 번째 사건은 후보입니다. 함수 변수.
참고 : PostgreSQL9.0 이전 버전은 변수를 대체하려고합니다. 세 가지 경우 모두 구문 오류로 이어집니다.
변수의 이름은 구문 적으로 다르지 않기 때문입니다 테이블 열의 이름에서 표를 참조하는 진술 : 주어진 이름은 테이블 열 또는 변수를 참조하십시오. 바꾸자 이전의 예
dest에 삽입 (col) src에서 foo + bar를 선택하십시오.
여기,destandSRC테이블 이름이어야합니다.coldest그러나fooandbar합리적으로있을 수 있습니다 함수의 변수 또는SRC.
기본적으로스포츠 토토/pgsql의지 SQL 문의 이름이 변수 또는 테이블 열. 그러한 문제를 해결할 수 있습니다 변수 또는 열을 바꾸거나 모호한 참조 또는 말하기스포츠 토토/pgsql어떤 해석 선호하다.
가장 간단한 솔루션은 변수 또는 열의 이름을 바꾸는 것입니다. 에이 일반적인 코딩 규칙은에 대해 다른 명명 규칙을 사용하는 것입니다.스포츠 토토/pgsql당신보다 변수 열 이름에 사용됩니다. 예를 들어, 지속적으로 이름을 지정하는 경우 함수 변수V_뭔가열 중 어느 것도 없습니다 이름으로 시작V_, 충돌은 없습니다 발생하다.
또는 대안 적으로 모호한 참조를 할 수 있습니다 분명합니다. 위의 예에서src.foo표 열. 변수에 대한 명백한 참조를 만들려면 라벨이 붙은 블록에 선언하고 블록의 레이블을 사용하십시오 (참조Postgre범퍼카 토토 : 문서 : 9.2 : PL/PG범퍼카 토토의 구조). 을 위한 예,
<< 블록 선언하다 foo int; 시작하다 foo : = ...; SRC에서 DEST (COL)에 삽입 (COL) SELECT BLOCK.FOO + BAR;
여기block.foo변수를 의미합니다 열이 있더라도fooinSRC. 기능 매개 변수뿐만 아니라 와 같은 특수 변수발견, can 함수 이름에 따라 자격을 갖추십시오 암시 적으로 라벨이 붙은 외부 블록에서 암시 적으로 선언되었습니다 기능의 이름.
때로는 모호한 것을 모두 고치는 것이 비현실적입니다 큰 몸에서의 참조스포츠 토토/pgsql코드. 그러한 경우에 당신은 할 수 있습니다 이를 지정스포츠 토토/pgsql변수로 모호한 참조를 해결하십시오 (즉 호환스포츠 토토/pgsql's 이전의 행동PostgreSQL9.0) 또는 테이블 열 (일부와 호환됩니다. 와 같은 기타 시스템Oracle).
시스템 전체에 따라이 동작을 변경하려면 구성 매개 변수스포츠 토토pgsql.variable_conflict오류, use_variable또는use_column(where오류공장 기본값입니다). 이 매개 변수 의 후속 문자에 영향을 미칩니다스포츠 토토/pgsql기능이지만 진술은 아닙니다 현재 세션에서 이미 컴파일되었습니다. 이것을 바꾸기 때문에 설정은의 동작에 예기치 않은 변화를 일으킬 수 있습니다.스포츠 토토/pgsql함수는 가능합니다 슈퍼업자에 의해서만 변경됩니다.
당신은 또한 기능별로 동작을 설정할 수도 있습니다 기본, 처음에 이러한 특별 명령 중 하나를 삽입하여 함수 텍스트의 :
#Variable_Conflict 오류 #variable_conflict use_variable #variable_conflict use_column
이 명령은 작성된 기능에만 영향을 미칩니다. 의 설정을 무시합니다스포츠 토토pgsql.variable_conflict. 예는입니다.
함수 만들기 stamp_user (id int, 댓글 텍스트)를 $$로 반환합니다. #variable_conflict use_variable 선언하다 Curtime timestamp : = now (); 시작하다 업데이트 사용자가 set last_modified = curtime, comment = comment 여기서 users.id = id; 끝; $$ 언어 plpgsql;
in업데이트명령,CURTIME, 댓글및id함수를 참조합니다 변수 및 매개 변수 여부사용자그 이름의 열이 있습니다. 우리가 주목하십시오 에 대한 참조 자격을 갖추어야했습니다users.idin여기서테이블 열을 참조하는 조항. 그러나 우리는하지 않았다 에 대한 참조 자격을 갖추어야합니다.댓글업데이트구문 적 으로야하기 때문에 열사용자. 우리는 쓸 수 있습니다 에 따라 동일한 기능variable_conflict이런 식으로 설정 :
함수 만들기 stamp_user (id int, 댓글 텍스트)는 void를 $$로 반환합니다. << fn 선언하다 Curtime timestamp : = now (); 시작하다 업데이트 사용자가 set last_modified = fn.curtime, comment = stamp_user.comment입니다 여기서 users.id = stamp_user.id; 끝; $$ 언어 plpgsql;
명령 문자열에서 변수 대체가 발생하지 않습니다 주어진execute또는 그 중 하나 변형. 그러한 값에 다양한 값을 삽입 해야하는 경우 명령, 문자열 값 구성의 일부로 그렇게하거나 사용사용,섹션 39.5.4.
가변 대체는 현재에서만 작동합니다select, 삽입, 업데이트및삭제기본 SQL 엔진이기 때문에 명령 이 명령에서만 쿼리 매개 변수를 허용합니다. 사용하려면 다른 명령문 유형의 비정상적인 이름 또는 값 (일반적으로 유틸리티 명세서라고 불림)를 구성해야합니다 문자열로서의 유틸리티 진술 및executeit.
the스포츠 토토/pgsql통역사 함수의 소스 텍스트를 구문 분석하고 내부를 생성합니다 이진 명령 트리 기능이 처음으로 호출되는 경우 (각 세션 내에서). 지침 트리는 완전히 번역됩니다 그만큼스포츠 토토/pgsql진술 구조이지만 개인SQL표현 및SQL함수에 사용 된 명령은 그렇지 않습니다 즉시 번역.
각 표현 및SQL명령에서 처음 실행됩니다
기능,스포츠 토토/pgsql통역사는 명령을 구문 분석하고 분석하여 a를 생성합니다
준비된 진술,SPI관리자SPI_PREPARE
함수. 후속 방문
그 표현 또는 명령은 준비된 진술을 재사용합니다. 따라서,
거의 방문하지 않는 조건부 코드 경로가있는 기능
해당 명령을 분석하는 오버 헤드는 결코 발생하지 않습니다.
현재 세션 내에서 실행되지 않습니다. 단점
특정 표현 또는 명령의 오류는
함수의 해당 부분에 도달 할 때까지 감지
실행. (Trivial Syntax 오류는이 중에 감지됩니다
초기 구문 분석 패스이지만 더 깊은 것은 감지되지 않습니다.
실행 될 때까지.)
스포츠 토토/pgsql(또는 그 이상 정확히, SPI 관리자)는 또한 캐시를 시도 할 수 있습니다 특정 준비된 실행 계획 성명. 캐시 된 계획이 사용되지 않으면 새로운 실행 성명서를 방문 할 때마다 계획이 생성됩니다. 현재 매개 변수 값 (즉,스포츠 토토/pgsql가변 값)를 사용 할 수 있습니다 선택한 계획을 최적화하십시오. 문에 매개 변수가없는 경우 또는 여러 번 실행되면 SPI 관리자는 A 생성제네릭그렇지 않은 계획 특정 매개 변수 값에 따라,이를 캐싱합니다 재사용. 일반적으로 이것은 실행 계획에만 발생합니다 의 값에 크게 민감하지 않습니다.스포츠 토토/pgsql변수에 참조. 만약 매번 계획을 생성하는 것은 순 승리입니다.
때문에PL/PGSQL저장 이런 식으로 준비된 진술과 때로는 실행 계획, A에 직접 나타나는 SQL 명령스포츠 토토/pgsql함수는 동일한 것을 참조해야합니다 모든 실행에 대한 테이블 및 열; 즉, 사용할 수 없습니다 SQL 명령의 테이블 또는 열의 이름으로 매개 변수. 이 제한을 해결하려면 역동적 인 것을 구성 할 수 있습니다 사용 명령스포츠 토토/pgsql execute진술 - 가격에 새로운 구문 분석을 수행하고 새로운 실행을 구성합니다 모든 실행에 대한 계획.
레코드 변수의 변이 가능한 특성은 다른 것을 제시합니다 이와 관련하여 문제. 레코드 변수의 필드 표현 또는 명세서, 데이터 유형에 사용됩니다. 필드는 함수의 한 호출에서 다음으로, 각 표현식은 데이터를 사용하여 분석됩니다. 표현식에 처음 도달했을 때 존재하는 유형.execute이 문제를 해결하는 데 사용할 수 있습니다 필요한 경우 문제.
동일한 함수가 둘 이상의 트리거로 사용되는 경우 테이블,스포츠 토토/pgsql준비 및 각 테이블에 대해 독립적으로 진술을 캐시합니다. 각 트리거 기능과 테이블에 대한 캐시가 있습니다. 각 함수뿐만 아니라 조합. 이것은 일부를 완화시킵니다 다양한 데이터 유형의 문제에 대한; 예를 들어, a 트리거 기능은 열이라는 열키발생하더라도 다른 테이블에 다른 유형이 있습니다.
마찬가지로 다형성 인수 유형을 갖는 기능에는 a가 있습니다 실제 조합에 대한 별도의 명령문 캐시 인수 유형이 호출 된 인수 유형이므로 데이터 유형 차이로 인해 예상치 못한 실패가 발생하지 않습니다.
Statement Caching은 때때로 놀라운 영향을 미칠 수 있습니다 시간에 민감한 값의 해석. 예를 들어 이 두 기능의 차이점은 다음과 같습니다.
함수 생성 logfunc1 (logtxt 텍스트)는 void를 $$로 반환합니다 시작하다 Logtable 값 (logtxt, 'now')에 삽입; 끝; $$ 언어 plpgsql;
및 :
함수 생성 logfunc2 (logtxt 텍스트)는 void를 $$로 반환합니다 선언하다 곡선 타임 스탬프; 시작하다 큐 타임 : = '지금'; Logtable 값 (logtxt, curtime)에 삽입; 끝; $$ 언어 plpgsql;
의 경우logfunc1
,스포츠 토토Main Parser는 알고 있습니다
분석 할 때삽입끈'now'타임 스탬프,의 대상 열이기 때문에logtable
는 그 유형입니다. 따라서,'now'A로 변환됩니다타임 스탬프삽입는 분석 한 다음 모든 것에 사용됩니다
의 호출logfunc1
세션의 수명. 말할 것도없이, 이것은 무엇이 아닙니다
프로그래머는 원했습니다. 더 나은 아이디어는 사용하는 것입니다.now ()또는current_timestamp기능.
의 경우logfunc2
, ThePostgreSQL메인 파서입니다
어떤 유형을 모른다'now'따라서 유형의 데이터 값을 반환합니다텍스트문자열 포함now. 다음으로 현지인에게 임무를 수행하는 동안
변하기 쉬운CURTIME, The스포츠 토토/pgsql인터프리터는이 문자열을 캐스트합니다
그만큼타임 스탬프전화하여 타이핑text_out
andTimestamp_in
변환 기능.
따라서 계산 된 타임 스탬프는 각 실행에 따라
프로그래머가 기대합니다. 비록 이것이 작동하지만
예상, 그것은 크게 효율적이지 않으므로 사용now ()함수는 여전히 더 나은 아이디어가 될 것입니다.