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

44.5. 예

이 섹션에는 SPI 사용의 매우 간단한 예가 포함되어 있습니다. 그만큼 절차execqSQL 명령을 가져옵니다 첫 번째 논쟁과 행을 두 번째로 계산하면 사용 명령SPI_EXEC그리고 반환 명령에 의해 처리 된 행의 수. 당신은 찾을 수 있습니다 소스 트리에서 SPI에 대한 더 복잡한 예SRC/TEST/Regress/Regress.Cand theSPI모듈.

#include "postgres.h"

#include "Executor/Spi.h"
#include "utils/buildins.h"

#ifdef pg_module_magic
PG_MODULE_MAGIC;
#endif

int execq (text *sql, int cnt);

int
execq (text *sql, int cnt)

    char *명령;
    int ret;
    int proc;

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

    spi_connect ();

    ret = spi_exec (command, cnt);

    Proc = SPI_PROCESSED;
    /*
     * 일부 행을 가져 오면 elog (정보)을 통해 인쇄하십시오.
     */
    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 ++)

            핵심 튜플 = 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 (정보, "execq : %s", buf);

    spi_finish ();
    pfree (명령);

    반환 (Proc);

(이 기능은 Call Convention 버전 0을 사용하여 이해하기 쉬운 예. 실제 응용 프로그램에서 사용해야합니다 새 버전 1 인터페이스)

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

함수 생성 execq (텍스트, 정수) 정수를 반환합니다
    처럼 'filename12514_12533

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

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

= 값에 삽입 (execq ( '값에 삽입 (0)', 0);
삽입 0 1
= select execq ( 'select * from a', 0);
정보 : execq : 0- execq에 의해 삽입되었습니다
정보 : execq : 1- execQ에 의해 반환되고 상단 삽입에 의해 삽입 됨

 execq
-------
     2
(1 줄)

= select execq ( 'a', 1에서 선택 x + 2에 삽입);
 execq
-------
     1
(1 줄)

= select execq ( 'select * from a', 10);
정보 : execq : 0
정보 : execQ : 1
정보 : execq : 2-0 + 2, 지정된대로 하나의 행만 삽입

 execq
-------
     3-10은 최대 값, 3은 실수 행 수입니다.
(1 줄)

= a에서 삭제;
삭제 3
= 값에 삽입 (execq ( 'select * from a', 0) + 1);
삽입 0 1
= 선택 *에서;
 엑스
---
 1- (0) + 1의 행이 없습니다
(1 줄)

= 값에 삽입 (execq ( 'select * from a', 0) + 1);
정보 : execQ : 1
삽입 0 1
= 선택 *에서;
 엑스
---
 1
 2- + 1에 한 줄이있었습니다.
(2 줄)

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

= select execq에 삽입 ( 'select * from a', 0) * x from a;
정보 : execQ : 1
정보 : execQ : 2
정보 : execQ : 1
정보 : execQ : 2
정보 : execQ : 2
0 2 삽입
= 선택 *에서;
 엑스
---
 1
 2
 2-2 행 * 1 (첫 번째 줄에서 x)
 6-3 행 (2 + 1 방금 삽입) * 2 (x 2 열에서 x)
(4 줄) ^^^^^^
                       다른 호출에서 execq ()에 보이는 행