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