Phần này chứa một ví dụ rất đơn giản về việc sử dụng SPI. Quy trìnhEXECQ
lấy lệnh SQL làm đối số đầu tiên và một hà토토 được tính là thứ hai, thực thi lệnh bằ토토 cách sử dụ토토SPI_EXEC
và trả về số lượng hàng được xử lý theo lệnh. Bạn có thể tìm thấy các ví dụ phức tạp hơn cho SPI trong cây nguồn trongsrc/test/regress/repress.c
và tro토토토토 커뮤니티 Postgresql: Tài liệu: 10: F.37. SPIMô -đun.
#include "Postgres.h" #include "Executor/spi.h" #include "Utils/buildins.h" #ifdef pg_module_magic Pg_module_magic; #endif Pg_function_info_v1 (exec); Mốc thời gian EXECQ (PG_FUNCTION_ARGS) lệnh char *; int cnt; int ret; UInt64 Proc; / * Chuyển đổi đối tượng văn bản đã cho thành chuỗi C */ lệnh = text_to_cstring (pg_getarg_text_pp (0)); cnt = pg_getarg_int32 (1); Spi_connect (); ret = spi_exec (lệnh, cnt); Proc = spi_proced; /* * Nếu một số hàng được tìm nạp, hãy in chúng qua ELOG (thông tin). */ if (ret 0 && spi_tuptable! = null) Tupledesc tupdesc = spi_tuptable- tupdesc; Spitupletable *TUPTABLE = spi_tuptable; char buf [8192]; uint64 j; for (j = 0; j <proc; j ++) Nặng tuple = tupsable- 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 (tuple, tupdesc, i), (i == Tupdesc- natts)? "": "|"); ELOG (thông tin, "Execq: %s", buf); Spi_finish (); pfree (lệnh); Pg_return_int64 (Proc);
Đây là cách bạn khai báo chức nă토토 sau khi biên dịch nó vào thư viện dù토토 chu토토 (chi tiết tro토토Phần 37.9.5.):
Tạo hàm EXECQ (Text, Integer) Trả về Int8
BẰNG 'FileName
'
토토ôn 토토ữ C 토토hiêm 토토ặt;
Đây là phiên mẫu:
= Chọn Execq ('Tạo Bảng A (x số nguyên)', 0); EXECQ ------- 0 (1 hàng) = Chèn vào một giá trị (exec ('chèn vào một giá trị (0)', 0)); Chèn 0 1 = Chọn Execq ('Chọn * từ A', 0); Thông tin: EXECQ: 0 - Được chèn bởi EXECQ Thông tin: EXECQ: 1 - Được ASCQ trả về và được chèn bởi Chèn trên EXECQ ------- 2 (1 hàng) = Chọn Execq ('Chèn vào A Chọn x + 2 từ A', 1); EXECQ ------- 1 (1 hàng) = Chọn Execq ('Chọn * từ A', 10); Thông tin: Execq: 0 Thông tin: Execq: 1 Thông tin: Execq: 2 - 0 + 2, chỉ có một hàng được chèn - theo chỉ định EXECQ ------- 3 - 10 chỉ là giá trị tối đa, 3 là số hàng thực (1 hàng) = Xóa khỏi a; Xóa 3 = Chèn vào một giá trị (Execq ('select * từ a', 0) + 1); Chèn 0 1 = Chọn * từ a; x --- 1 - Không có hàng trong A (0) + 1 (1 hàng) = Chèn vào một giá trị (Execq ('select * từ a', 0) + 1); Thông tin: Execq: 1 Chèn 0 1 = Chọn * từ a; x --- 1 2 - Có một hàng trong A + 1 (2 hàng) - Điều này thể hiện quy tắc hiển thị thay đổi dữ liệu: = Chèn vào một exec Chọn ('select * từ a', 0) * x từ a; Thông tin: Execq: 1 Thông tin: Execq: 2 Thông tin: Execq: 1 Thông tin: Execq: 2 Thông tin: Execq: 2 Chèn 0 2 = Chọn * từ a; x --- 1 2 2 - 2 hàng * 1 (x ở hàng đầu tiên) 6 - 3 hàng (2 + 1 vừa chèn) * 2 (x ở hàng thứ hai) (4 hàng) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ hàng có thể hiển thị cho exec () trong các yêu cầu khác nhau