이 SPI 사용 예는 가시성 규칙을 보여줍니다. src/test/regress/regress.c에 더 복잡한 예가 있습니다. 그리고 contrib/spi에 있습니다.
이것은 SPI 사용법의 매우 간단한 예입니다. 프로시저 스포츠 토토 첫 번째 인수에 SQL 쿼리를 허용하고 해당 인수에 tcount를 허용합니다. 둘째, SPI_exec를 사용하여 쿼리를 실행하고 쿼리가 실행된 튜플:
#include "executor/spi.h" /* 이것은 SPI로 작업하는 데 필요한 것입니다 */
int 스포츠 토토(text *sql, int cnt);
정수
스포츠 토토(텍스트 *sql, int cnt)
int ret;
int proc = 0;
SPI_connect();
ret = SPI_exec(textout(sql), cnt);
proc = SPI_processed;
/*
* 이것이 SELECT이고 일부 튜플을 가져온 경우 -
* elog(NOTICE)를 통해 호출자에게 튜플을 반환합니다.
*/
if ( ret == SPI_OK_SELECT && SPI_processed 0 )
TupleDesc tupdesc = SPI_tuptable-tupdesc;
SPITupleTable *tuptable = SPI_tuptable;
char buf[8192];
나는 int;
for(ret = 0; ret < proc; ret++)
HeapTuple 튜플 = 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(알림, "스포츠 토토: %s", buf);
SPI_finish();
반환(proc);
이제 함수를 컴파일하고 생성하십시오:
생성 함수 스포츠 토토(text, int4)는 int4를 '...path_to_so' 언어 'c'로 반환합니다.
vac= select 스포츠 토토('테이블 a 생성(x int4)', 0);
실행
-----
0
(1줄)
vac= 값에 삽입 (스포츠 토토('값에 삽입 (0)',0));
삽입 167631 1
vac= select 스포츠 토토('select * from a',0);
공지:스포츠 토토: 0 <<< 스포츠 토토에 의해 삽입됨
NOTICE:스포츠 토토: 1 <<< 스포츠 토토에 의해 반환되고 상위 INSERT에 의해 삽입된 값
실행
-----
2
(1줄)
vac= select 스포츠 토토('a에서 x + 2를 선택하여 삽입',1);
실행
-----
1
(1줄)
vac= select 스포츠 토토('select * from a', 10);
공지사항:스포츠 토토: 0
공지사항:스포츠 토토: 1
NOTICE:스포츠 토토: 2 <<< 0 + 2, 지정된 대로 하나의 튜플만 삽입됨
실행
-----
3 <<< 10은 최대값만, 3은 실수 튜플 수입니다.
(1줄)
vac= a에서 삭제;
3개 삭제
vac= 값에 삽입 (스포츠 토토('select * from a', 0) + 1);
삽입 167712 1
vac= a에서 *를 선택합니다;
엑스
-
1 <<< (0) + 1에는 튜플이 없습니다.
(1줄)
vac= 값에 삽입 (스포츠 토토('select * from a', 0) + 1);
공지사항:스포츠 토토: 0
삽입 167713 1
vac= a에서 *를 선택합니다;
엑스
-
1
2 <<< a + 1에 단일 튜플이 있었습니다.
(2열)
-- 이는 데이터 변경 가시성 규칙을 보여줍니다.
vac= 선택에 삽입 스포츠 토토('select * from a', 0) * x from a;
공지사항:스포츠 토토: 1
공지사항:스포츠 토토: 2
공지사항:스포츠 토토: 1
공지사항:스포츠 토토: 2
공지사항:스포츠 토토: 2
삽입 0 2
vac= a에서 *를 선택합니다;
엑스
-
1
2
2 <<< 2 튜플 * 1 (첫 번째 튜플의 x)
6 <<< 3개의 튜플(방금 삽입된 2 + 1) * 2(두 번째 튜플의 x)
(4열) ^^^^^^^^
다른 호출에서 스포츠 토토()에 표시되는 튜플