이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.범퍼카 토토0버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

46.6. 예시

이 섹션에는 SPI 사용에 대한 매우 간단한 예가 포함되어 있습니다. C 함수스포츠 토토첫 번째 인수로 SQL 명령을 취하고 두 번째 인수로 행 수를 취하고 다음을 사용하여 명령을 실행합니다.SPI_exec그리고 명령으로 처리된 행 수를 반환합니다. 소스 트리에서 SPI에 대한 더 복잡한 예를 찾을 수 있습니다.src/test/regress/regress.c그리고스포츠 토토 결과 : 문서 : 12 : F.36. SPI모듈.

#include "postgres.h"

#include "executor/spi.h"
#include "utils/buildins.h"

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(스포츠 토토);

데이텀
스포츠 토토(PG_FUNCTION_ARGS)

    char *명령;
    int cnt;
    int ret;
    uint64 proc;

    /* 주어진 텍스트 객체를 C 문자열로 변환 */
    명령 = text_to_cstring(PG_GETARG_TEXT_PP(0));
    cnt = PG_GETARG_INT32(1);

    SPI_connect();

    ret = SPI_exec(명령어, cnt);

    proc = SPI_processed;

    /*
     * 일부 행을 가져온 경우 elog(INFO)를 통해 인쇄합니다.
     */
    if (ret  0 && SPI_tuptable != NULL)

        TupleDesc tupdesc = SPI_tuptable-tupdesc;
        SPITupleTable *tuptable = SPI_tuptable;
        char buf[8192];
        uint64j;

        for (j = 0; j < proc; j++)

            HeapTuple 튜플 = tuptable-vals[j];
            나는 int;

            for (i = 1, buf[0] = 0; i <= tupdesc-natts; i++)
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %s%s",
                        SPI_getvalue(튜플, tupdesc, i),
                        (i == tupdesc-natts) ? " " : " |");
            elog(INFO, "EXECQ: %s", buf);

    SPI_finish();
    pfree(명령);

    PG_RETURN_INT64(proc);

이것은 공유 라이브러리로 컴파일한 후 함수를 선언하는 방법입니다(자세한 내용은 참조)섹션 37.10.5.):

CREATE FUNCTION 스포츠 토토(텍스트, 정수) RETURNS int8
    그대로 '파일 이름'
    언어 C 엄격;

다음은 샘플 세션입니다:

= SELECT 스포츠 토토('CREATE TABLE a (x 정수)', 0);
 실행
-------
     0
(1줄)

= VALUES에 삽입 (스포츠 토토('VALUES에 삽입 (0)', 0));
삽입 0 1
= SELECT 스포츠 토토('SELECT * FROM a', 0);
정보: 실행: 0-- 스포츠 토토에 의해 삽입됨정보: EXECQ: 1-- 스포츠 토토에 의해 반환되고 상위 INSERT에 의해 삽입스포츠 토토
-------
     2
(1줄)

= SELECT 스포츠 토토('반환 *에서 SELECT x + 2에 삽입', 1);
정보: 실행: 2-- 0 + 2, 카운트에 의해 실행이 중지됨스포츠 토토
-------
     1
(1줄)

= SELECT 스포츠 토토('SELECT * FROM a', 10);
정보: EXECQ: 0
정보: EXECQ: 1
정보: EXECQ: 2

 실행
-------
     3-- 10은 최대값이고 3은 실제 행 수입니다.(1행)

= SELECT 스포츠 토토('SELECT x + 10 FROM a에 삽입', 1);
 실행
-------
     3-- 모든 행이 처리되었습니다. 아무것도 반환되지 않으므로 count는 이를 중지하지 않습니다.(1행)

= SELECT * FROM a;
 엑스
----
  0
  1
  2
 10
 11
 12
(6열)

= a에서 삭제;
6개 삭제
= VALUES에 삽입 (스포츠 토토('SELECT * FROM a', 0) + 1);
삽입 0 1
= SELECT * FROM a;
 엑스
---
 1-- 0(a에 행 없음) + 1(1행)

= VALUES에 삽입 (스포츠 토토('SELECT * FROM a', 0) + 1);
정보: EXECQ: 1
삽입 0 1
= SELECT * FROM a;
 엑스
---
 1
 2-- 1(a에 한 행이 있음) + 1(2행)-- 이는 데이터 변경 가시성 규칙을 보여줍니다.
-- 스포츠 토토가 두 번 호출되고 매번 다른 수의 행이 표시됩니다.= SELECT 스포츠 토토('SELECT * FROM a', 0) * x FROM a에 삽입;
정보: 실행: 1-- 첫 번째 스포츠 토토의 결과정보: EXECQ: 2
정보: 실행: 1-- 두 번째 스포츠 토토의 결과정보: EXECQ: 2
정보: EXECQ: 2
삽입 0 2
= SELECT * FROM a;
 엑스
---
 1
 2
 2-- 2행 * 1(첫 번째 행의 x)
 6                  -- 3개 행(방금 삽입된 2 + 1) * 2(두 번째 행의 x)(4행)