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

43.5. 예

이 섹션에는 SPI 사용에 대한 매우 간단한 예가 포함되어 있습니다. 그만큼 절차배트맨 토토SQL을 사용합니다 명령을 첫 번째 인수로 사용하고 행을 두 번째 인수로 계산합니다. 다음을 사용하여 명령을 실행합니다.SPI_exec그리고 처리된 행 수를 반환합니다. 명령. 소스에서 SPI에 대한 더 복잡한 예를 찾을 수 있습니다. 나무 안에src/test/regress/regress.c그리고 안에기여/spi.

#include "postgres.h"

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

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

int 배트맨 토토(text *sql, int cnt);

정수
배트맨 토토(텍스트 *sql, int cnt)

    char *명령;
    int ret;
    int 프로세스;

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

    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];
        int i, j;

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

            HeapTuple 튜플 = tuptable-vals[j];

            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(명령);

    반환(proc);

(이 함수는 호출 규칙 버전 0을 사용하여 예를 들어 이해하기 더 쉽습니다. 실제 응용 프로그램에서는 다음을 사용해야 합니다. 새로운 버전 1 인터페이스.)

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

CREATE FUNCTION 배트맨 토토(텍스트, 정수) RETURNS 정수
    처럼 '파일 이름'
    언어 C;

다음은 샘플 세션입니다:

= SELECT 배트맨 토토('CREATE TABLE a (x 정수)', 0);
 실행
-------
     0
(1줄)

= VALUES에 삽입 (배트맨 토토('VALUES에 삽입 (0)', 0));
삽입 0 1
= SELECT 배트맨 토토('SELECT * FROM a', 0);
INFO: EXECQ: 0 -- 배트맨 토토에 의해 삽입됨
INFO: EXECQ: 1 -- 배트맨 토토에 의해 반환되고 상위 INSERT에 의해 삽입됨

 실행
-------
     2
(1줄)

= SELECT 배트맨 토토('INSERT INTO a SELECT x + 2 FROM a', 1);
 실행
-------
     1
(1줄)

= SELECT 배트맨 토토('SELECT * FROM a', 10);
정보: EXECQ: 0
정보: EXECQ: 1
INFO: EXECQ: 2 -- 0 + 2, 지정된 대로 행 하나만 삽입됨

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

= a에서 삭제;
3개 삭제
= VALUES에 삽입 (배트맨 토토('SELECT * FROM a', 0) + 1);
삽입 0 1
= SELECT * FROM a;
 엑스
---
 1 - (0) + 1에 행이 없습니다.
(1줄)

= VALUES에 삽입 (배트맨 토토('SELECT * FROM a', 0) + 1);
정보: EXECQ: 1
삽입 0 1
= SELECT * FROM a;
 엑스
---
 1
 2 - + 1에 행이 하나 있었습니다.
(2열)

-- 이는 데이터 변경 가시성 규칙을 보여줍니다.

= SELECT 배트맨 토토('SELECT * FROM a', 0) * x FROM a에 삽입;
정보: EXECQ: 1
정보: EXECQ: 2
정보: EXECQ: 1
정보: EXECQ: 2
정보: EXECQ: 2
삽입 0 2
= SELECT * FROM a;
 엑스
---
 1
 2
 2 -- 2행 * 1(첫 번째 행의 x)
 6 - 3행(방금 삽입된 2 + 1) * 2(두 번째 행의 x)
(4줄) ^^^^^^
                       다른 호출에서 배트맨 토토()에 표시되는 행