이 섹션에는 SPI 사용에 대한 매우 간단한 예가 포함되어 있습니다. 는
절차토토 베이SQL을 사용합니다
명령을 첫 번째 인수로 사용하고 행을 두 번째 인수로 계산합니다.
다음을 사용하여 명령을 실행합니다.SPI_exec그리고 처리된 행 수를 반환합니다.
명령. 소스에서 SPI에 대한 더 복잡한 예를 찾을 수 있습니다.
나무 안에src/test/regress/regress.c그리고
에서기여/spi.
#include "executor/spi.h"
int 토토 베이(text *sql, int cnt);
정수
토토 베이(텍스트 *sql, int cnt)
char *명령;
int ret;
int 프로세스;
/* 주어진 텍스트 객체를 C 문자열로 변환 */
명령 = DatumGetCString(DirectFunctionCall1(텍스트아웃,
PointerGetDatum(sql)));
SPI_connect();
ret = SPI_exec(명령어, cnt);
proc = SPI_processed;
/*
* SELECT이고 일부 행을 가져온 경우
* 행은 elog(INFO)를 통해 인쇄됩니다.
*/
if (ret == SPI_OK_SELECT && SPI_processed 0)
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 인터페이스.)
함수를 컴파일한 후 선언하는 방법입니다. 공유 라이브러리에:
CREATE FUNCTION 토토 베이(텍스트, 정수) RETURNS 정수
그대로 '파일 이름'
언어 C;
다음은 샘플 세션입니다:
= SELECT 토토 베이('CREATE TABLE a (x 정수)', 0);
실행
-------
0
(1줄)
= VALUES에 삽입 (토토 베이('VALUES에 삽입 (0)', 0));
삽입 167631 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);
삽입 167712 1
= SELECT * FROM a;
엑스
---
1 - (0) + 1에 행이 없습니다.
(1줄)
= VALUES에 삽입 (토토 베이('SELECT * FROM a', 0) + 1);
정보: EXECQ: 0
삽입 167713 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줄) ^^^^^^
다른 호출에서 토토 베이()에 표시되는 행