이 섹션에는 SPI 사용에 대한 매우 간단한 예가 포함되어 있습니다. C 함수토토 핫SQL 명령을 첫 번째 인수로, 행 개수를 두 번째 인수로 사용하고 다음을 사용하여 명령을 실행합니다.SPI_exec그리고 명령으로 처리된 행 수를 반환합니다. 소스 트리에서 SPI에 대한 더 복잡한 예를 찾을 수 있습니다.src/test/regress/regress.c그리고사설 토토 : 문서 : 13 : 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)
        SPITupleTable *tuptable = SPI_tuptable;
        TupleDesc tupdesc = tuptable-tupdesc;
        char buf[8192];
        uint64j;
        for (j = 0; j < tuptable-numvals; 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행)
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.