이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 42.5. PL/롤 토토에서 데이터베이스 액세스버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

43.5. PL/스포츠 토토 결과에서 데이터베이스 액세스

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

spi_exec ?-개수n? ?-배열이름? 명령 ?루프-본문?

문자열로 제공된 SQL 명령을 실행합니다. 명령에 오류가 있으면 오류가 발생합니다. 그렇지 않으면 반환 값은spi_exec은 명령으로 처리된(선택, 삽입, 업데이트 또는 삭제) 행 수이거나 명령이 유틸리티 문인 경우 0입니다. 또한 명령이 다음과 같은 경우선택문, 선택한 열의 값은 아래 설명과 같이 Tcl 변수에 배치됩니다.

선택사항-개수가치가 말해주는 것spi_exec명령에서 처리할 최대 행 수. 이 효과는 쿼리를 커서로 설정한 다음 다음과 같이 말하는 것과 비슷합니다.가져오기n.

명령이 다음과 같은 경우선택문, 결과 열의 값은 열 이름을 딴 Tcl 변수에 배치됩니다. 만약-배열옵션이 주어지면 열 값은 대신 배열 인덱스로 사용되는 열 이름과 함께 명명된 연관 배열의 요소에 저장됩니다. 또한 결과 내의 현재 행 번호(0부터 계산)는 이름이 지정된 배열 요소에 저장됩니다..tupno, 해당 이름이 결과에서 열 이름으로 사용되지 않는 한.

명령이 다음과 같은 경우선택진술 및 아니오루프-본문스크립트가 주어지면 결과의 첫 번째 행만 스포츠 토토 결과 변수 또는 배열 요소에 저장됩니다. 나머지 행은 무시됩니다. 쿼리가 행을 반환하지 않으면 저장이 발생하지 않습니다. (이런 경우는 결과를 확인하면 알 수 있습니다.spi_exec.) 예:

spi_exec "SELECT count(*) AS cnt FROM pg_proc"

스포츠 토토 결과 변수를 설정합니다$cnt행의 수에pg_proc시스템 카탈로그.

선택사항인 경우루프-본문인수가 주어지면 이는 쿼리 결과의 각 행에 대해 한 번씩 실행되는 스포츠 토토 결과 스크립트의 일부입니다. (루프-본문주어진 명령이 a가 아니면 무시됩니다.선택.) 현재 행의 열 값은 각 반복 전에 Tcl 변수 또는 배열 요소에 저장됩니다. 예를 들면:

spi_exec -array C "SELECT * FROM pg_class" 
    elog DEBUG "테이블 $C(relname) 있음"

다음의 모든 행에 대한 로그 메시지를 인쇄합니다.pg_class. 이 기능은 다른 스포츠 토토 결과 루핑 구성과 유사하게 작동합니다. 특히계속그리고휴식루프 본문 내에서 일반적인 방식으로 작업합니다.

쿼리 결과의 열이 null인 경우 해당 열의 대상 변수는 다음과 같습니다.설정 해제설정되지 않고.

spi_prepare 질의 유형 목록

나중 실행을 위해 쿼리 계획을 준비하고 저장합니다. 저장된 계획은 현재 세션이 진행되는 동안 유지됩니다.

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

다음의 반환 값spi_prepare다음 호출에 사용할 쿼리 ID입니다.spi_execp. 참조spi_execp예를 들어.

spi_execp ?-개수n? ?-배열이름? ?-널문자열? 쿼리ID ?값 목록? ?루프-본문?

이전에 준비된 쿼리를 실행합니다.spi_prepare. 쿼리ID에서 반환한 ID입니다.spi_prepare. 쿼리가 매개변수를 참조하는 경우, a값 목록반드시 제공되어야 합니다. 이것은 매개변수에 대한 실제 값의 Tcl 목록입니다. 목록은 이전에 제공된 매개변수 유형 목록과 길이가 동일해야 합니다.spi_prepare. 생략값 목록쿼리에 매개변수가 없는 경우.

다음에 대한 선택적 값-null공백의 문자열이고'n'문자가 말하는spi_execp매개변수 중 null 값인 것은 무엇입니까? 주어진 경우, 길이는 반드시값 목록. 지정되지 않은 경우 모든 매개변수 값은 null이 아닙니다.

쿼리와 해당 매개변수가 지정되는 방식을 제외하고,spi_execp다음과 같이 작동합니다spi_exec.-개수, -배열루프-본문옵션은 동일하며 결과 값도 동일합니다.

다음은 준비된 계획을 사용하는 PL/Tcl 기능의 예입니다.

CREATE FUNCTION t1_count(정수, 정수) $$로 정수를 반환합니다.
    if ![ 정보가 존재하는 경우 GD(plan) ] 
        # 첫 번째 호출에서 저장된 계획을 준비합니다.
        GD 설정(계획) [ spi_prepare \
                "SELECT count(*) AS cnt FROM t1 WHERE num = \$1 AND num <= \$2" \
                [ 목록 int4 int4 ] ]

    spi_execp -count 1 $GD(계획) [ 목록 $1 $2 ]
    $cnt 반환
$$ 언어 pltcl;

다음에 제공된 쿼리 문자열 내에 백슬래시가 필요합니다.spi_prepare다음을 보장하기 위해$n마커는 다음으로 전달됩니다.spi_prepare있는 그대로이며 스포츠 토토 결과 변수 대체로 대체되지 않습니다.

spi_lastoid

마지막으로 삽입된 행의 OID를 반환합니다.spi_exec또는spi_execp, 명령이 단일 행인 경우삽입그리고 수정된 테이블에는 OID가 포함되어 있습니다. (그렇지 않으면 0을 얻습니다.)

하위 거래 명령

다음에 포함된 Tcl 스크립트명령은 SQL 하위 트랜잭션 내에서 실행됩니다. 스크립트가 오류를 반환하면 전체 하위 트랜잭션이 롤백된 후 주변 Tcl 코드로 오류가 반환됩니다. 참조PostgreSQL : 문서 : 10 : 43.9. PL/토토 베이에서의 명시 적 차축자세한 내용과 예시를 확인하세요.

인용문 문자열

주어진 문자열에서 작은따옴표와 백슬래시 문자의 모든 발생을 두 배로 늘립니다. 이는 주어진 SQL 명령에 삽입될 문자열을 안전하게 인용하는 데 사용할 수 있습니다.spi_exec또는spi_prepare. 예를 들어 다음과 같은 SQL 명령 문자열을 생각해 보세요.

"'$val' AS ret 선택"

여기서 스포츠 토토 결과 변수실제로는 다음을 포함함그렇지 않습니다. 그러면 최종 명령 문자열이 생성됩니다.

재개로 '하지 않음' 선택

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

재개로 '하지 않음' 선택

다음을 사용하여 PL/Tcl에서 형성될 수 있습니다.

"SELECT '[ quote $val ]' AS ret"

한 가지 장점spi_execp매개변수는 SQL 명령 문자열의 일부로 구문 분석되지 않으므로 이와 같이 매개변수 값을 인용할 필요가 없습니다.

elog 레벨 msg

로그 또는 오류 메시지를 내보냅니다. 가능한 수준은 다음과 같습니다.디버그, 로그, 정보, 공지사항, 경고, 오류치명적. 오류오류 조건을 발생시킵니다. 이것이 주변 Tcl 코드에 의해 트랩되지 않으면 오류가 호출 쿼리로 전파되어 현재 트랜잭션이나 하위 트랜잭션이 중단됩니다. 이는 사실상 Tcl과 동일합니다.오류명령.치명적트랜잭션을 중단하고 현재 세션을 종료합니다. (PL/Tcl 함수에서 이 오류 수준을 사용할 타당한 이유는 없지만 완전성을 위해 제공됩니다.) 다른 수준은 서로 다른 우선 순위 수준의 메시지만 생성합니다. 특정 우선순위의 메시지가 클라이언트에 보고되는지, 서버 로그에 기록되는지 또는 둘 다에 의해 제어되는지 여부는log_min_messages그리고client_min_messages구성 변수. 참조PostgreSQL : 문서 : 10 : 19 장 서버 와이즈 토토그리고PostgreSQL : 문서 : 10 : 43.8. PL/토토 결과에서의 오류 처리더 많은 정보를 원하시면.