| Postgre스포츠 토토 베트맨 9.3.25 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.3 : 토토 커뮤니티 프로 시저 | Postgre메이저 토토 사이트 : 문서 : 9.3 : PL/PG메이저 토토 사이트 -메이저 토토 사이트 절차 언어 | 40장.PL/pg스포츠 토토 베트맨 - 스포츠 토토 베트맨절차적 언어 | 다음 | |
이 섹션에서는 다음과 같은 구현 세부 사항을 논의합니다. 자주 중요한PL/pg스포츠 토토 베트맨사용자가 알아야 합니다.
a 내의 스포츠 토토 베트맨 문 및 표현식PL/pg스포츠 토토 베트맨함수는 변수를 참조할 수 있으며 함수의 매개변수. 비하인드 스토리,PL/pg스포츠 토토 베트맨다음과 같은 쿼리 매개변수를 대체합니다. 참조. 매개변수는 다음 위치에서만 대체됩니다. 매개변수 또는 열 참조는 구문상 허용됩니다. 로서 극단적인 경우, 잘못된 프로그래밍 스타일의 예를 고려해 보세요.
foo(foo) 값(foo)에 삽입;
다음의 첫 번째 발생foo반드시 구문상 테이블 이름이므로 대체되지 않습니다. 함수에 이름이 지정된 변수가 있는 경우foo. 두 번째로 나타나는 것은 테이블의 열 이름이어야 하므로 그것도 대체되지 않습니다. 세 번째 발생만 함수의 변수에 대한 참조가 될 후보입니다.
참고: 포스트그레스포츠 토토 베트맨9.0 이전 버전에서는 모든 항목에서 변수를 대체하려고 시도합니다. 세 가지 경우로 인해 구문 오류가 발생합니다.
변수 이름은 구문적으로 다음과 다르지 않기 때문에 테이블 열 이름, 명령문에 모호함이 있을 수 있음 테이블도 참조하는 이름입니다. 테이블 열입니까, 아니면 변수입니까? 앞의 예를 바꿔보자 에
INSERT INTO dest(col) SELECT foo + bar FROM src;
여기,대상그리고src테이블 이름이어야 하며,col다음 열이어야 합니다.대상하지만foo그리고바합리적으로 변수일 수 있습니다. 함수 또는 열의src.
기본적으로,PL/pg스포츠 토토 베트맨할 것이다 스포츠 토토 베트맨 문의 이름이 다음 중 하나를 참조할 수 있으면 오류를 보고합니다. 변수 또는 테이블 열. 다음과 같은 방법으로 이러한 문제를 해결할 수 있습니다. 변수나 열의 이름을 바꾸거나 모호한 변수를 한정하여 참조 또는 말함으로써PL/pg스포츠 토토 베트맨어떤 해석을 선호하는지.
가장 간단한 해결책은 변수나 열의 이름을 바꾸는 것입니다. 에이 일반적인 코딩 규칙은 다른 명명 규칙을 사용하는 것입니다.PL/pg스포츠 토토 베트맨당신이 사용하는 것보다 변수 열 이름의 경우. 예를 들어, 함수 이름을 일관되게 지정하는 경우 변수v_뭔가당신의 열에는 아무것도 없습니다 이름은 다음으로 시작합니다.v_, 충돌이 발생하지 않습니다. 발생합니다.
또는 모호한 참조를 한정하여 만들 수 있습니다. 명확하다. 위의 예에서,src.foo그러겠다 테이블 열에 대한 명확한 참조여야 합니다. 생성하려면 변수에 대한 명확한 참조, 레이블이 지정된 블록에서 선언 블록의 라벨을 사용합니다(참조섹션 40.2). 예를 들어,
<<블록
선언
foo int;
시작
foo := ...;
INSERT INTO dest (col) SELECT block.foo + bar FROM src;
여기block.foo변수가 짝수임을 의미합니다. 열이 있는 경우fooinsrc. 기능 매개변수 및 특수 매개변수 다음과 같은 변수발견, 자격을 얻을 수 있습니다. 함수 이름으로 암시적으로 선언되기 때문입니다. 함수 이름으로 라벨이 붙은 외부 블록.
때로는 모든 모호한 참조를 수정하는 것이 비실용적일 수 있습니다. 큰 몸에서PL/pg스포츠 토토 베트맨코드. 그러한 경우 다음을 지정할 수 있습니다.PL/pg스포츠 토토 베트맨모호한 참조를 해결해야 합니다. 변수로 (호환 가능PL/pg스포츠 토토 베트맨이전의 행동Postgre스포츠 토토 베트맨9.0) 또는 테이블 열( 다음과 같은 다른 시스템과 호환됩니다.오라클).
시스템 전반에 걸쳐 이 동작을 변경하려면 구성 매개변수plpg스포츠 토토 베트맨.variable_contribute다음 중 하나에게오류, use_variable또는use_column(어디에서오류공장 기본값임). 이 매개변수 이후의 명령문 컴파일에 영향을 줍니다.PL/pg스포츠 토토 베트맨함수, 그러나 이미 명령문은 아님 현재 세션에서 컴파일되었습니다. 이 설정을 변경하면 의 동작에 예상치 못한 변화를 일으킵니다.PL/pg스포츠 토토 베트맨함수는 다음에 의해서만 변경될 수 있습니다. 슈퍼유저.
또한 기능별로 동작을 설정할 수 있습니다. 시작 부분에 이러한 특수 명령 중 하나를 삽입하여 기능 텍스트:
#변수_충돌 오류 #변수_충돌 사용_변수 #변수_충돌 사용_열
이 명령은 작성된 기능에만 영향을 미치며, 설정을 무시합니다.plpg스포츠 토토 베트맨.variable_contribute. 예를 들면 다음과 같습니다.
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
#변수_충돌 사용_변수
선언
curtime 타임스탬프 := now();
시작
UPDATE 사용자 SET last_modified = curtime, 댓글 = 댓글
여기서 users.id = id;
끝;
$$ 언어 plpgsql;
에서업데이트명령,커타임, 댓글및id함수 변수를 참조합니다. 및 매개변수 여부사용자있음 해당 이름의 열입니다. 우리는 참조를 검증해야 했습니다. 에users.id에서어디에서절을 사용하여 테이블 열을 참조하도록 합니다. 그러나 우리는 다음과 같은 언급을 한정할 필요는 없었습니다.댓글대상으로업데이트목록, 왜냐하면 구문론적으로 이는 다음과 같아야 하기 때문입니다. 열사용자. 우리도 똑같이 쓸 수 있어요 에 의존하지 않고 함수를 작동합니다.변수_충돌이런 식으로 설정:
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
<<fn
선언
curtime 타임스탬프 := now();
시작
UPDATE 사용자 SET last_modified = fn.curtime, 댓글 = stamp_user.comment
여기서 users.id = stamp_user.id;
끝;
$$ 언어 plpgsql;
명령 문자열에서 변수 대체가 발생하지 않습니다. 에게 주어졌다실행또는 그 변종 중 하나. 이러한 명령에 다양한 값을 삽입해야 하는 경우 다음과 같이 하십시오. 문자열 값 구성의 일부 또는 사용사용 중, 그림 참조섹션 40.5.4.
변수 대체는 현재 다음에서만 작동합니다.선택, 삽입, 업데이트및삭제명령(기본 스포츠 토토 베트맨 엔진은 쿼리 매개변수만 허용하므로) 이 명령에서. 상수가 아닌 이름이나 값을 다른 항목에서 사용하려면 명령문 유형(일반적으로 유틸리티 명령문이라고 함)을 사용하려면 다음을 수행해야 합니다. 유틸리티 설명을 문자열로 구성하고실행그것.
그PL/pg스포츠 토토 베트맨통역사가 구문 분석함 함수의 소스 텍스트를 생성하고 내부 바이너리를 생성합니다. 함수가 처음 호출될 때 명령 트리(각 세션). 지침 트리는 다음을 완전히 번역합니다.PL/pg스포츠 토토 베트맨문 구조, 그러나 개별스포츠 토토 베트맨표현 및스포츠 토토 베트맨다음에 사용되는 명령 함수는 즉시 번역되지 않습니다.
각 표현과스포츠 토토 베트맨명령은 함수에서 처음 실행됩니다.PL/pg스포츠 토토 베트맨통역사는 다음을 구문 분석하고 분석합니다.
를 사용하여 준비된 문을 만드는 명령SPI관리자의SPI_prepare함수. 그 이후의 방문
표현식 또는 명령은 준비된 명령문을 재사용합니다. 따라서,
거의 방문되지 않는 조건부 코드 경로가 있는 함수는
절대 사용되지 않는 명령을 분석하는 오버헤드가 발생하지 않습니다.
현재 세션 내에서 실행됩니다. 단점은 오류가
특정 표현식이나 명령에서는 그 때까지 감지할 수 없습니다.
함수의 일부가 실행 중에 도달합니다. (사소한 구문
초기 구문 분석 과정에서 오류가 감지되지만
더 깊은 것은 실행될 때까지 감지되지 않습니다.)
PL/pg스포츠 토토 베트맨(더 정확하게는, SPI 관리자)는 추가로 실행 캐시를 시도할 수 있습니다. 특정 준비된 진술과 관련된 계획. 캐시된 경우 계획이 사용되지 않으면 각각에 대해 새로운 실행 계획이 생성됩니다. 명령문을 방문하고 현재 매개변수 값(즉,PL/pg스포츠 토토 베트맨변수 값)은 다음과 같습니다. 선택한 계획을 최적화하는 데 사용됩니다. 명세서에 없는 경우 매개변수를 사용하거나 여러 번 실행되면 SPI 관리자는 생성을 고려해보세요.일반그 계획은 특정 매개변수 값에 종속되지 않고 이를 캐싱합니다. 재사용. 일반적으로 이는 실행 계획이 다음과 같은 경우에만 발생합니다. 값에 그다지 민감하지 않습니다.PL/pg스포츠 토토 베트맨변수가 참조되었습니다. 만약 그렇다면, 매번 계획을 세우는 것은 순 승리입니다. 참조준비에 대한 자세한 내용은 준비된 문의 행동.
왜냐하면PL/pg스포츠 토토 베트맨저장 준비됨 이런 식으로 명령문을 실행하고 때로는 실행 계획을 세우는 스포츠 토토 베트맨 명령 a에 직접 표시되는PL/pg스포츠 토토 베트맨함수는 모든 항목에서 동일한 테이블과 열을 참조해야 합니다. 실행; 즉, 매개변수를 이름으로 사용할 수 없습니다. 스포츠 토토 베트맨 명령의 테이블 또는 열. 이 제한을 해결하려면 다음을 사용하여 동적 명령을 구성할 수 있습니다.PL/pg스포츠 토토 베트맨 실행statement — 새로운 구문 분석을 수행하는 대가를 치르고 매 실행마다 새로운 실행 계획을 수립합니다.
레코드 변수의 변경 가능 특성은 또 다른 문제를 나타냅니다. 이와 관련하여. 레코드 변수의 필드가 사용되는 경우 표현식 또는 명령문에서 필드의 데이터 유형은 함수의 한 호출에서 다음 호출로 변경됩니다. 표현식은 존재하는 데이터 유형을 사용하여 분석됩니다. 표현식에 처음 도달할 때.실행다음 경우에 이 문제를 해결하는 데 사용할 수 있습니다. 필요합니다.
동일한 함수가 둘 이상의 트리거로 사용되는 경우 테이블,PL/pg스포츠 토토 베트맨준비하고 각 테이블에 대해 독립적으로 명령문을 캐시합니다. 즉, 각 트리거 기능과 테이블 조합에 대한 캐시가 있습니다. 각 기능뿐만 아니라. 이를 통해 일부 문제가 완화됩니다. 다양한 데이터 유형으로; 예를 들어 트리거 기능은 다음과 같습니다. 이름이 지정된 열로 성공적으로 작업할 수 있습니다.키우연히 다른 유형이 있더라도 테이블이 달라요.
마찬가지로, 다형성 인수 유형을 갖는 함수는 실제 인수의 각 조합에 대해 별도의 명령문 캐시 호출된 유형이므로 데이터 유형 차이는 예기치 않은 오류가 발생하지 않습니다.
문 캐싱은 때때로 다음에 놀라운 영향을 미칠 수 있습니다. 시간에 민감한 값의 해석. 예를 들어 이 두 함수가 수행하는 작업의 차이점은 다음과 같습니다.
CREATE FUNCTION logfunc1(logtxt text) 반환 $$로 무효
시작
INSERT INTO 로그 테이블 VALUES(logtxt, 'now');
끝;
$$ 언어 plpg스포츠 토토 베트맨;
그리고:
CREATE FUNCTION logfunc2(logtxt text) 반환 $$로 무효
선언
curtime 타임스탬프;
시작
curtime := '지금';
INSERT INTO 로그 테이블 VALUES(logtxt, curtime);
끝;
$$ 언어 plpg스포츠 토토 베트맨;
다음의 경우logfunc1, 그Postgre스포츠 토토 베트맨메인 파서는 언제인지 알고 있습니다.
분석하다삽입그 문자열'지금'다음과 같이 해석되어야 합니다타임스탬프, 대상 열이로그테이블그런 종류입니다. 따라서,'지금'a로 변환됩니다타임스탬프일 때 상수삽입분석된 후 모든 호출에 사용됩니다.
의logfunc1일생 동안
세션. 말할 필요도 없이, 이것은 프로그래머가 하는 일이 아닙니다.
원했다. 더 좋은 아이디어는 다음을 사용하는 것입니다.지금()또는현재_타임스탬프함수.
다음의 경우logfunc2, 그Postgre스포츠 토토 베트맨주 파서는 그렇지 않습니다
어떤 유형인지 알아요'지금'이 되어야 하고
따라서 유형의 데이터 값을 반환합니다.텍스트문자열 포함지금. 이후 현지 임무를 수행하는 동안
변수커타임, 그PL/pg스포츠 토토 베트맨통역사가 이 문자열을타임스탬프다음을 호출하여 입력text_out그리고timestamp_in변환을 위한 함수. 그래서,
계산된 타임스탬프는 실행될 때마다 업데이트됩니다.
프로그래머는 기대합니다. 예상대로 이런 일이 발생하더라도
별로 효율적이지 않으므로 다음을 사용하십시오.지금()함수는 여전히 더 나은 아이디어일 것입니다.
| 이전 | 배트맨 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | 다음 |
| 트리거 절차 | Postgre메이저 토토 사이트 : 문서 : 9.3 : PL/PG메이저 토토 사이트 -메이저 토토 사이트 절차 언어 | 개발을 위한 팁PL/pg스포츠 토토 베트맨 |