이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다범퍼카 토토0버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

45.6. 예#

이 섹션에는 SPI 사용의 매우 간단한 예가 포함되어 있습니다. C 함수사설 토토SQL 명령을 첫 번째 인수로, 행을 두 번째 인수로 간주하고를 사용하여 명령을 실행합니다.SPI_EXEC명령에 의해 처리 된 행 수를 반환합니다. 소스 트리에서 SPI에 대한 더 복잡한 예제를 찾을 수 있습니다SRC/TEST/Regress/Regress.Cand the배트맨 토토 : 문서 : 개발 : F.41. 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 (command, cnt);

    Proc = SPI_PROCESSED;

    /*
     * 일부 행을 가져 오면 elog (정보)을 통해 인쇄하십시오.
     */
    if (ret 0 && spi_tuptable! = null)

        spitupletable *tuptable = spi_tuptable;
        tupledesc tupdesc = tuptable- tupdesc;
        Char Buf [8192];
        UINT64 J;

        for (j = 0; j <tuptable- numvals; j ++)

            핵심 튜플 = tuptable- vals [j];
            int i;

            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 (정보, "사설 토토 : %s", buf);

    spi_finish ();
    pfree (명령);

    pg_return_int64 (Proc);

이것은 기능을 공유 라이브러리로 컴파일 한 후 기능을 선언하는 방법입니다 (세부 사항은섹션 36.10.5.) :

함수 생성 사설 토토 (텍스트, 정수) int8을 반환합니다
    처럼 'filename'
    언어 C 엄격한;

샘플 세션은 다음과 같습니다.

= 사설 토토 ( '테이블 생성 a (x integer)', 0);
 사설 토토
-------
     0
(1 줄)

= 값에 삽입 (사설 토토 ( '값에 삽입 (0)', 0);
삽입 0 1
= select 사설 토토 ( 'select * from a', 0);
정보 : execQ : 0- 사설 토토에 의해 삽입정보 : 사설 토토 : 1- 사설 토토에 의해 반환되고 상단 삽입물에 의해 삽입사설 토토
-------
     2
(1 줄)

= select 사설 토토 ( '반환 *'에서 선택 x + 2에 삽입, 1);
정보 : execQ : 2- 0 + 2, 그 후 실행은 count에 의해 중지되었습니다사설 토토
-------
     1
(1 줄)

= select 사설 토토 ( 'select * from a', 10);
정보 : 사설 토토 : 0
정보 : execQ : 1
정보 : execQ : 2

 사설 토토
-------
     3- 10은 최대 값 만, 3은 실수 행 수입니다(1 행)

= select 사설 토토 ( 'a', 1에서 선택 x + 10에 삽입);
 사설 토토
-------
     3- 처리 된 모든 행; 카운트는 그것을 멈추지 않습니다. 아무것도 반환되지 않기 때문에(1 행)

= 선택 *에서;
 엑스
----
  0
  1
  2
 10
 11
 12
(6 줄)

= a에서 삭제;
삭제 6
= 값에 삽입 (사설 토토 ( 'select * from a', 0) + 1);
삽입 0 1
= 선택 *에서;
 엑스
---
 1- 0 (a의 행 없음) + 1(1 행)

= 값에 삽입 (사설 토토 ( 'select * from a', 0) + 1);
정보 : execQ : 1
삽입 0 1
= 선택 *에서;
 엑스
---
 1
 2- 1 (a에 한 줄이있었습니다) + 1(2 줄)- 데이터 변경 가시성 규칙을 보여줍니다.
- 사설 토토는 두 번 호출되고 매번 다른 행의 행을 볼 수 있습니다 := select 사설 토토에 삽입 ( 'select * from a', 0) * x from a;
정보 : execQ : 1- 첫 번째 사설 토토의 결과정보 : 사설 토토 : 2
정보 : execQ : 1- Second 사설 토토의 결과정보 : 사설 토토 : 2
정보 : execQ : 2
0 2 삽입
= 선택 *에서;
 엑스
---
 1
 2
 2- 2 줄 * 1 (첫 번째 행에서 x)
 6                  - 3 행 (2 + 1 방금 삽입) * 2 (x in 2 줄)(4 줄)