지원되지 않는 버전 :6.3
이 문서는 지원되지 않는 버전의 사설 토토 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.
사설 토토
이전 39 장. 서버 프로그래밍 인터페이스 다음

예제

이 SPI 사용의 예는 가시성 규칙을 보여줍니다. SRC/Test/Regress/Regress.C에는 더 복잡한 예가 있습니다 그리고 Contrib/spi.

이것은 SPI 사용의 매우 간단한 예입니다. 절차 execq 첫 번째 논쟁에서 SQL-Query를 받아들이고 Tcount가 둘째, spi_exec을 사용하여 쿼리를 실행하고 쿼리가 실행 된 튜플 :

#include "executor/spi.h"/ * 이것은 spi */로 작업하는 데 필요한 것입니다.

int execq (text *sql, int cnt);

int
execq (text *sql, int cnt)

        int ret;
        int proc = 0;

        spi_connect ();

        ret = spi_exec (Teptout (SQL), CNT);

        Proc = SPI_PROCESSED;
        /*
         * 이것이 선택되고 일부 튜플이 가져 오면 -
         * elog (통지)을 통해 튜플을 발신자에게 반환합니다.
         */
        if (ret == spi_ok_select && spi_processed 0)

                tupledesc tupdesc = spi_tuptable- tupdesc;
                spitupletable *tuptable = spi_tuptable;
                Char Buf [8192];
                int i;

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

                        핵심 튜플 = tuptable- vals [ret];

                        for (i = 1, buf [0] = 0; i <= tupdesc- natts; i ++)
                                sprintf (buf + strlen (buf), " %s %s",
                                        spi_getValue (튜플, tupdesc, i),
                                        (i == tupdesc- natts)? "": "|");
                        elog (통지, "execq : %s", buf);

        spi_finish ();

        반환 (Proc);

이제 기능을 컴파일하고 만듭니다.

함수 생성 execq (text, int4)는 int4를 '... path_to_so'language 'c';로 반환합니다.
vac = select execq ( '테이블 생성 a (x int4)', 0);
execq
-----
    0
(1 줄)

vac = 값에 삽입 (execq ( '값에 삽입 (0)', 0);
삽입 167631 1
vac = select execq ( 'select * from a', 0);
통지 : execq : 0 <<< execq에 의해 삽입되었습니다

통지 : execq : 1 <<< 값 execq에 의해 반환되고 상단 삽입에 의해 삽입 된 값

execq
-----
    2
(1 줄)

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

vac = select execq ( 'select * from a', 10);
주목 : execq : 0 

주목 : execq : 1 

통지 : execq : 2 <<< 0 + 2, 지정된대로 하나의 튜플 만 삽입

execq
-----
    3 <<< 10은 최대 값 만, 3은 튜플의 진짜 #입니다.
(1 줄)

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

vac = 값에 삽입 (execq ( 'select * from a', 0) + 1);
주목 : execq : 0 
삽입 167713 1
vac = select * from a;
엑스
-
1
2 <<< a + 1에 단일 튜플이있었습니다.
(2 줄)

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

vac = select execq에 삽입 ( 'select * from a', 0) * x from a;
주목 : execq : 1 
주목 : execQ : 2 
주목 : execq : 1 
주목 : execQ : 2 
주목 : execQ : 2 
0 2 삽입
vac = select * from a;
엑스
-
1
2
2 <<< 2 튜플 * 1 (첫 번째 튜플에서 x)
6 <<< 3 튜플 (2 + 1 방금 삽입) * 2 (x 제 2 튜플에서 x)
(4 줄) ^^^^^^^^ 
                     다른 호출에서 execq ()에 보이는 튜플

이전 다음
데이터 가시성 변화 up libpq