43.5. PL/롤 토토에서 데이터베이스 액세스

이 섹션에서는 괄호 대신 물음표를 사용하는 일반적인 TCL 규칙을 따라 구문 시놉시스의 선택적 요소를 나타냅니다. PL/TCL 기능 본문에서 데이터베이스에 액세스하기 위해 다음 명령을 사용할 수 있습니다.

SPI_EXEC?-countn? ?-어레이이름?명령?루프 바디?

문자열로 주어진 SQL 명령을 실행합니다. 명령의 오류로 인해 오류가 발생합니다. 그렇지 않으면의 반환 값SPI_EXEC명령에 의해 처리 된 행 수 (선택, 삽입, 업데이트 또는 삭제) 또는 명령이 유틸리티 문인 경우 0이됩니다. 또한 명령이 A 인 경우select문서, 선택한 열의 값은 아래에 설명 된대로 롤 토토 변수에 배치됩니다.

선택 사항-count값이SPI_EXEC한 번 중지하려면n쿼리에 a가 포함 된 것처럼 행이 검색되었습니다.Limit절. 만약에n| 쿼리가 완료됩니다.-count생략.

명령이 a 인 경우select문서, 결과 열의 값은 열에 이름을 따서 명명 된 tcl 변수에 배치됩니다. 인 경우-array옵션이 제공되면 열 값은 대신에 명명 된 연관 배열의 요소에 저장되며 열 이름은 배열 인덱스로 사용됩니다. 또한 결과 내의 현재 행 번호 (0에서 카운트)가 지명 된 배열 요소에 저장됩니다..Tupno, 해당 이름이 결과에서 열 이름으로 사용되지 않는 한.

명령이 a 인 경우select진술 및 아니오루프 바디스크립트가 주어지면 첫 번째 행만이 롤 토토 변수 또는 배열 요소에 저장됩니다. 나머지 행은 무시됩니다. 쿼리가 행을 반환하지 않으면 저장이 발생하지 않습니다. (이 경우는의 결과를 확인하여 감지 할 수 있습니다.SPI_EXEC.) 예 :

SPI_EXEC "PG_PROC에서 CNT로 COUNT (*)를 선택하십시오."

롤 토토 변수를 설정합니다$ cnt의 행 수PG_PROC시스템 카탈로그.

선택 사항 인 경우루프 바디인수가 주어지면, 쿼리 결과에서 각 행에 대해 한 번 실행되는 롤 토토 스크립트입니다. (루프 바디주어진 명령이 A가 아닌 경우 무시됩니다select.) 현재 행 열의 값은 각 반복 전에 TCL 변수 또는 배열 요소에 저장됩니다. 예를 들어:

SPI_EXEC -ARRAY C "선택 *에서 pg_class"
    Elog Debug "Table $ C (Relname)가 있습니다.

모든 행에 대한 로그 메시지를 인쇄합니다PG_CLASS. 이 기능은 다른 롤 토토 루핑 구조와 유사하게 작동합니다. 특히계속andbreak루프 본체 내부의 일반적인 방식으로 작업하십시오.

쿼리 결과 열이 null이면 대상 변수가Unset설정되지 않고.

SPI_PREPARE 쿼리 typelist

나중에 실행을위한 쿼리 계획을 준비하고 저장합니다. 저장된 계획은 현재 세션의 수명 동안 유지됩니다.

쿼리는 매개 변수, 즉 계획이 실제로 실행될 때마다 값을 제공 할 자리 표시자를 사용할 수 있습니다. 쿼리 문자열에서 기호별로 매개 변수를 참조하십시오$ 1 ... $n. 쿼리가 매개 변수를 사용하는 경우 매개 변수 유형의 이름을 TCL 목록으로 제공해야합니다. (빈 목록 작성typelist매개 변수가 사용되지 않은 경우.)

반환 값에서SPI_PREPARE후속 호출에서 사용할 쿼리 ID입니다SPI_EXECP. 보다SPI_EXECP예를 들어.

SPI_EXECP?-countn? ?-array이름? ?-nullsString?QueryId?Value-List? ?루프 바디?

이전에 준비한 쿼리 실행SPI_PREPARE. QueryIdid는SPI_PREPARE. 쿼리가 매개 변수를 참조하는 경우 aValue-List제공해야합니다. 이것은 매개 변수에 대한 실제 값의 tcl 목록입니다. 목록은 이전에 주어진 매개 변수 유형 목록과 동일한 길이 여야합니다.SPI_PREPARE. 생략Value-List쿼리에 매개 변수가없는 경우.

선택적 값-nulls공백의 문자열 및'n'캐릭터 텔링SPI_EXECP매개 변수 중 널 값은 어떤 매개 변수입니다. 주어지면와 정확히 같은 길이를 가져야합니다.Value-List. 주어지지 않으면 모든 매개 변수 값은 Nonnull입니다.

쿼리 및 매개 변수가 지정되는 방식을 제외하고SPI_EXECPSPI_EXEC. 그만큼-count, -array루프 바디옵션은 동일하며 결과 값도 동일합니다.

준비된 계획을 사용한 PL/TCL 기능의 예는 다음과 같습니다.

함수 만들기 t1_count (정수, 정수)는 정수를 $$로 반환합니다
    ! [정보가 gd (plan)] 가 있다면
        # 첫 번째 통화에 저장된 계획을 준비합니다
        GD 설정 (계획) [SPI_PREPARE \
                "num = \ $ 1, num <= \ $ 2"\에서 cnt로 cnt (*)를 선택하십시오.
                [List Int4 Int4]]

    SPI_EXECP -COUNT 1 $ gd (계획) [목록 $ 1 $ 2]
    $ CNT를 반환합니다
$$ 언어 pltcl;

우리는 주어진 쿼리 문자열 내부에 백 슬래시가 필요합니다SPI_PREPARE$n마커가 통과됩니다.SPI_PREPAREas-is, 그리고 롤 토토 변수 대체로 대체되지 않았습니다.

​​SubTransaction 명령

롤 토토 스크립트에 포함 된명령는 SQL Subtransaction 내에서 실행됩니다. 스크립트가 오류를 반환하면 오류를 주변 TCL 코드로 반환하기 전에 해당 전체 하위 트랜잭션이 롤백됩니다. 보다PostgreSQL : 문서 : 13 : 43.9. PL/토토 사이트 순위에서의 명시 적 차축자세한 내용과 예는

QUOTE String

주어진 문자열에서 단일 인용문과 백 슬래시 문자의 모든 발생을 두 배로 늘립니다. 이것은 주어진 SQL 명령에 삽입 될 문자열을 안전하게 인용하는 데 사용될 수 있습니다.SPI_EXEC또는SPI_PREPARE. 예를 들어, SQL 명령 문자열에 대해 다음과 같이 생각하십시오.

" '$ val'을 ret as"

여기서 롤 토토 변수val실제로 포함그렇지 않음. 이로 인해 최종 명령 문자열이 발생합니다.

선택한 'do n't'as as ret

이 동안 구문 분석 오류가 발생합니다SPI_EXEC또는SPI_PREPARE. 제대로 작동하려면 제출 된 명령에는 다음이 포함되어야합니다.

선택한 'does n't'as at ret

pl/롤 토토에서 형성 될 수 있습니다 :

"선택 '[QUOTE $ val]' 'AS RET"

하나의 이점SPI_EXECP매개 변수는 SQL 명령 문자열의 일부로 구문 분석되지 않기 때문에 이와 같은 매개 변수 값을 인용 할 필요가 없다는 것입니다..

elog 레벨 msg

로그 또는 오류 메시지를 방출합니다. 가능한 레벨은디버그, log, info, 통지, 경고, 오류치명적. 오류오류 조건을 제기합니다. 이것이 주변 TCL 코드에 의해 갇히지 않으면 오류가 호출 쿼리로 전파되어 현재 트랜잭션 또는 서브 트랜잭션이 중단됩니다. 이것은 사실상 TCL과 동일합니다오류명령.치명적거래를 중단하고 현재 세션이 종료됩니다. (PL/TCL 기능 에서이 오류 수준을 사용해야할만한 이유는 없지만 완전성을 위해 제공됩니다.) 다른 수준은 다른 우선 순위 수준의 메시지 만 생성합니다. 특정 우선 순위의 메시지가 클라이언트에게보고되었는지, 서버 로그에 기록되었는지 또는 둘 다에 의해 제어되는지log_min_messagesandclient_min_messages구성 변수. 보다사설 토토 사이트 : 문서 : 13 : 19 장. 서버 구성andPostgreSQL : 문서 : 13 : 43.8. PL/토토 캔에서의 오류 처리자세한 내용은

수정 제출

문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면