Phiên bản được hỗ trợ:hiện tại(17)16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong kèo bóng đá hom nay phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

9.5. C kèo bóng đá hom nay ngữ

Các chức năng do người dùng xác định có thể được viết bằng C (hoặc một kèo bóng đá hom nay ngữ mà"ckèo bóng đá hom nay năng từ"Nội bộ"kèo bóng đá hom nay năng --- mã hóa thực tế

Hai quy ước gọi khác nhau hiện đang được sử dụng cho c"Phiên bản 1"quy ước gọi được chỉ định bằng cách viết Apg_function_info_v1 ()Cuộc gọi macro cho kèo bóng đá hom nay năng,Tạo kèo bóng đá hom nay năngCin

9.5.1. Tải động

Lần đầu tiên kèo bóng đá hom nay năng do người dùng định nghĩa trong một cụ thểTạoDo đó, cho kèo bóng đá hom nay năng C do người dùng xác định

Thuật toán sau được sử dụng để định vị đối tượng được chia sẻTạolệnh:

  1. Nếu tên là đường dẫn tuyệt đối, tệp đã cho là

  2. Nếu tên bắt đầu bằng chuỗi$ libdir, phần đó được thay thế bằngPostgreSQLThư viện gói

  3. Nếu tên không chứa phần thư mục, tệpDynamic_l Library_path.

  4. Nếu không (tệp không được tìm thấy trong đường dẫn hoặc nó

Nếu chuỗi này không hoạt động, phần dành riêng cho nền tảng được chia sẻ.so) được gắn vào tên đã cho và cái này

Lưu ý:ID người dùngPostgreSQLMáy chủ chạy như phải có khả kèo bóng đá hom nayPostgresNgười dùng là một sai lầm phổ biến.

Trong mọi trường hợp, tên tệp được đưa ra trongTạo kèo bóng đá hom nay nănglệnh được ghi lại theo nghĩa đen trong

Lưu ý: POSTGRESQLsẽ không tự động biên dịch kèo bóng đá hom nay năng C. Đối tượngTạo kèo bóng đá hom nay năngLệnh. Nhìn thấyPhần 9.5.8cho

Lưu ý:sau khi nó được sử dụng lần đầu tiên, aloadlệnh hoặc bắt đầu một phiên mới.

Nên định vị kèo bóng đá hom nay thư viện được chia sẻ$ libdirhoặc thông qua động lực$ libdircó thể tìm thấypg_config.

Lưu ý:trướcPostgreSQLPhát hành 7.2, chỉ chính xácTạo kèo bóng đá hom nay năng. Cách tiếp cận này là

9.5.2. Căn cứ

Bảng 9-1Cung cấp loại C cần thiết cho kèo bóng đá hom nay tham số trong kèo bóng đá hom nay hàm CPostgreSQL. The"Được xác định trong"Cột đưa ra tệp tiêu đề màPostgres.hĐầu tiên trong bất kỳ tệp nguồn nào, vì nó

Bảng 9-1. kèo bóng đá hom nay loại C tương đương cho tích hợpPostgreSQLloại

SQL Loại C Loại được xác định trong
Abstime Tuyệt đối Utils/nabstime.h
Boolean bool Postgres.h(có thể
Box Box* UTILS/GEO_DECLS.H
bytea 18622_18630 Postgres.h
"Char" Char (trình biên dịch tích hợp)
Nhân vật bpchar* Postgres.h
CID CommandID Postgres.h
ngày dateadt Utils/date.h
SmallInt(INT2) INT2hoặcINT16 Postgres.h
int2Vector int2Vector* Postgres.h
Số nguyên(INT4) INT4hoặcINT32 Postgres.h
Real(float4) float4* Postgres.h
độ chính xác gấp đôi(float8) float8* Postgres.h
Khoảng Khoảng* Utils/Timestamp.h
LSEG LSEG* UTILS/GEO_DECLS.H
tên tên Postgres.h
OID OID Postgres.h
oidvector oidvector* Postgres.h
đường dẫn đường dẫn* UTILS/GEO_DECLS.H
điểm điểm* UTILS/GEO_DECLS.H
RegProc RegProc Postgres.h
Relime Relativetime Utils/nabstime.h
Text Text* Postgres.h
TID itempulum Storage/itemptr.h
thời gian Timeadt utils/date.h
Thời gian với múi giờ Timetzadt Utils/date.h
Dấu thời gian dấu thời gian* Utils/Timestamp.h
Tinterval Timeinterval Utils/nabstime.h
Varchar Varchar* Postgres.h
XID TranstercentID Postgres.h

nội bộ,PostgreSQLTrân trọng loại cơ sở là"Blob of. kèo bóng đá hom nay chức năng do người dùng xác định mà bạn xác địnhPostgreSQLcó thể hoạt động trên nó. Đó là,PostgreSQLsẽ chỉ lưu trữ và

  • Pass by giá trị, độ dài cố định

  • Pass by tham chiếu, độ dài cố định

  • Pass by tham chiếu, độ dài biến

kèo bóng đá hom nay loại giá trị chỉ có thể có chiều dài 1, 2 hoặc 4 byte (cũng là 8sizeof (mốc dữ liệu)là 8 trênLongLoại nguy hiểmintLoại là 4 byte trên hầu hết kèo bóng đá hom nay UnixINT4gõ trên máy Unix có thể là:

/ * 4 byte số nguyên, được truyền theo giá trị */

PostgreSQLtự động

Mặt khác, kèo bóng đá hom nay loại có độ dài cố định có thểPostgreSQLloại:

/ * Cấu trúc 16 byte, được truyền qua tham chiếu */

Chỉ có thể sử dụng kèo bóng đá hom nay gợi ý cho kèo bóng đá hom nay loại như vậy khi chuyển chúng vàoPostgreSQLkèo bóng đá hom nay năng. Để trả về giá trị của một loại như vậy, hãy phân bổ quyềnpalloc (), điền vàokhông bao giờSửa đổi nội dung của A

Cuối cùng, tất cả kèo bóng đá hom nay loại có độ dài thay đổi cũng phải được truyền qua

Typedef Struct

Rõ ràng, trường dữ liệu được khai báo ở đây không đủ dàiC, Chúng tôi dựa vào kiến ​​thức rằngCTrình biên dịch sẽ không kiểm tra phạm viCSách giáo khoa lập trình trước khi đào sâuPostgreSQLMáy chủ

#include "Postgres.h"

Varhdrszgiống nhưsizeof (int4), nhưng nó được coi là phong cách tốt đểVarhdrszđể tham khảo

Bây giờ chúng tôi đã vượt qua tất cả kèo bóng đá hom nay cấu trúc có thể

9.5.3.

Chúng tôi trình bày"Kiểu cũ"Gọi quy ước đầu tiên --- Mặc dù cách tiếp cận này hiện là

Đây là một số ví dụ:

#include "Postgres.h"

Giả sử rằng mã trên đã được chuẩn bị trong Tệpfuncs.cvà được biên dịch thành một chia sẻPostgreSQLvới kèo bóng đá hom nay lệnh như thế này:

Tạo kèo bóng đá hom nay năng add_one (int4) Trả về int4PGROOT/Hướng dẫn/kèo bóng đá hom nay ngữ của Funcs cPGROOT/Hướng dẫn/Funcs ',PGROOT/Hướng dẫn/kèo bóng đá hom nay ngữ của funcs cPGROOT/Hướng dẫn/kèo bóng đá hom nay ngữ 'funcs cPGROOT/Hướng dẫn/kèo bóng đá hom nay ngữ của funcs c

ở đâyPGROOTlà viết tắt củaPOSTGRESQLCây nguồn. (Phong cách tốt hơn sẽ là sử dụng chỉ'funcs'trongASmệnh đề, sau khi đã thêmPGROOT/Hướng dẫnđến đường dẫn tìm kiếm. Trong mọi trường hợp, chúng tôi có thể bỏ qua.sohoặc.SL.)

Lưu ý rằng chúng tôi đã chỉ định kèo bóng đá hom nay chức năng là"nghiêm ngặt", nghĩa là hệ thống nên

Mặc dù quy ước gọi này rất đơn giản, nhưng nó không phải là

9.5.4.

Quy ước gọi phiên bản-1 dựa trên kèo bóng đá hom nay macro để

Datum funcname (pg_function_args)

Ngoài ra, cuộc gọi macro

pg_function_info_v1 (funcname);

phải xuất hiện trong cùng một tệp nguồn (thông thường là nóNội bộ-LanguagePostgreSQLHiện tại giả định tất cả kèo bóng đá hom nay chức năng nội bộ là phiên bản-1.Yêu cầucho được tải động

Trong hàm phiên bản-1, mỗi đối số thực tế được tìm nạppg_getarg_xxx()Macro tương ứng vớipg_return_xxx()Macro cho Return

Ở đây chúng tôi hiển thị kèo bóng đá hom nay chức năng giống như trên, được mã hóa trong phiên bản-1

#include "Postgres.h"

TheTạo kèo bóng đá hom nay năngkèo bóng đá hom nay lệnh là

Thoạt nhìn, kèo bóng đá hom nay quy ước mã hóa phiên bản-1 có thể xuất hiệnadd_one_float8, chúng ta không còn cần phải biếtfloat8là loại tham chiếu qua.GetArgmacro cho kèo bóng đá hom nay loại có độ dài thay đổi cần phải đối phó với"Nướng"(nén hoặcCopyTextConcat_Textkèo bóng đá hom nay chức năng hiển thị ở trên làpg_detoast_datum ()trên

Một cải tiến lớn về kèo bóng đá hom nay chức năng phiên bản-1 tốt hơnpg_argisnull (n)Cho phép một kèo bóng đá hom nay năng kiểm tra"nghiêm ngặt"). Như vớipg_getarg_xxx()macro, đối số đầu vàopg_getarg_xxx()Cho đến khi người ta xác minh rằngpg_return_null (); Điều này hoạt động trong

kèo bóng đá hom nay tùy chọn khác được cung cấp trong giao diện kiểu mới là haipg_getarg_xxx()Macros. Cái đầu tiên trong số này,pg_getarg_xxx_copy ()Đảm bảo trả lại aPG_GetArg_xxx_copy ()macro đảm bảo a

Biến thể thứ hai bao gồmpg_getarg_xxx_slice ()Macro lấyBẢNG ALTERTableNameCột thay đổicolnameĐặt lưu trữStorAgetype. Loại lưu trữ là một trongtrơn, bên ngoài, mở rộnghoặcchính.)

kèo bóng đá hom nay quy ước gọi chức năng phiên bản-1"SET"Kết quả và thực hiệnTrong nguồn

9.5.5.

kèo bóng đá hom nay loại tổng hợp không có bố cục cố định như CPOSTGRESQLcung cấp aPostgreSQLxử lý một tập hợp kèo bóng đá hom nay hàng, mỗi hàng sẽ được chuyển vàotuple. Giả sử chúng ta muốn viết một kèo bóng đá hom nay năng để

Chọn Tên, C_OverPaid (EMP, 1500)

Trong truy vấn ở trên, chúng ta có thể xác địnhc_overpaidAs:

#include "Postgres.h"

GetAttributionByNamePostgreSQLHàm hệ thốngtupletableslot*được chuyển vào kèo bóng đá hom nay năng, tênGetAttributionByNameTrả về ADatumGiá trị mà bạn có thể chuyển đổi sang dữ liệu phù hợpDatumgetxxx()Macro.

lệnh sau cho phépPostgreSQLBiết vềc_overpaidkèo bóng đá hom nay năng:

Tạo kèo bóng đá hom nay năng C_overPaid (EMP, INT4)PGROOT/Hướng dẫn/Funcs '

9.5.6. Bàn

API kèo bóng đá hom nay năng bảng hỗ trợ trong việc tạo raPhần 9.7). kèo bóng đá hom nay năng bảngSRFs).

API chức năng bảng dựa trên kèo bóng đá hom nay macro và kèo bóng đá hom nay chức năng để

#include "funcapi.h"

9.5.6.1.

Hỗ trợ API kèo bóng đá hom nay năng bảng để trả về tổng hợpAttinMetadataCấu trúc. Cấu trúc nàytupledesc. Thông tintupledesc, nhưng nó được lưu trữ ở đây để tránhAttinMetadataCấu trúc nên được tính toán

typedef struct attinmetadata

Để hỗ trợ bạn điền vào cấu trúc này, một số

46510_46569

để nhậntupledescDựa trên a

46709_46770

để nhậntupledescdựa trên atupledesccho một cơ sở (vô hướng) hoặc tổng hợp

47029_47092

Sẽ trả một con trỏ choAttinMetadata, khởi tạo dựa trêntupledesc. AttinMetadatacó thể được sử dụng cùng nhau

Để trả về một tuple, bạn phải tạo một khe cắm Tuple dựa trêntupledesc. Bạn có thể sử dụng

tupletableslot *tupledescgetslot (tupledesc tupdesc)

Để khởi tạo khe cắm này hoặc lấy cái này quaDatumđể trả về chức năng. kèo bóng đá hom nay

Sau khi xây dựngAttinMetadataCấu trúc,

48103_48180

Có thể được sử dụng để xây dựng AHeaptupleĐã cho dữ liệu người dùng ở dạng chuỗi C.Giá trịMảng phải được đặt thànhnull. kèo bóng đá hom nay năng này sẽ cần được gọi

Xây dựng một tuple quatupledescgetattinmetadatabuildTupleFromCStringschỉ thuận tiệnthói quen đếnDatums trực tiếp vào Atupledescvà Atupletableslot, nhưng khôngAttinMetadata.

Một khi bạn đã xây dựng một tuple để trở về từ kèo bóng đá hom nay năng của mình,Datum. Sử dụng

49666_49722

để nhậnDatumCho một tuple và aDatumcó thể được trả về

Một ví dụ xuất hiện bên dưới.

9.5.6.2.

Hàm hoàn trả SET (SRF) thường được gọi một lần cho mỗiSRFDo đó phải tiết kiệm đủ trạng thái để nhớ nó là gìfunccallcontextCấu trúc để giúp kiểm soátfcinfo- flinfo- fn_extrađược sử dụng để giữfunccallcontexttrên kèo bóng đá hom nay cuộc gọi.

Cấu trúc typedef

ANSRFSử dụng một sốfunccallcontextCấu trúc (vàfn_extra).

SRF_IS_FIRSTCALL ()

Để xác định xem kèo bóng đá hom nay năng của bạn có được gọi cho

srf_firstcall_init ()

Để khởi tạofunccallcontext. Trên mọi cuộc gọi kèo bóng đá hom nay năng,

srf_percall_setup ()

Để thiết lập đúng cách sử dụngfunccallcontextvà xóa bất kỳ trước đó

Nếu kèo bóng đá hom nay năng của bạn có dữ liệu để trả về, hãy sử dụng

srf_return_next (funcctx, result)

Để trả lại cho người gọi. (Theresultphải làDatum,,

srf_return_done (funcctx)

Để dọn dẹp và kết thúcSRF.

Bối cảnh bộ nhớ hiện tại khiSRFđược gọi là mộtPFREEmọi thứ bạnPalloC; Nó sẽ biến mất dù sao.multi_call_memory_ctxlà một phù hợpSRFđược hoàn thành chạy.multi_call_memory_ctxWHER

Một ví dụ giả giả hoàn chỉnh trông giống như

Datum

Một ví dụ hoàn chỉnh về đơn giảnSRFTrả lại một loại tổng hợp trông

pg_function_info_v1 (testPassbyVal);

Với mã SQL hỗ trợ

Tạo loại __TestPassByVal AS (F1 Int4, F2 Int4, F3 Int4);

xem59717_59736Để biết thêm

9.5.7.

Bây giờ chúng tôi chuyển sang nhiệm vụ khó viết hơnC(bao gồm cả việc sử dụng con trỏ) trước khi cố gắng viếtCkèo bóng đá hom nay chức năng để sử dụng vớiPostgreSQL. Trong khi nó có thể làCthànhPostgreSQL, điều này thường khó khăn (khiFortranPascalthường không theo cùng mộtGọi quy ướcASC. Nghĩa là, các kèo bóng đá hom nay ngữ khác không quaC.

kèo bóng đá hom nay quy tắc cơ bản để xây dựngCkèo bóng đá hom nay chức năng như sau:

  • sử dụngpg_configĐể tìm ra nơiPostgreSQLkèo bóng đá hom nay tệp tiêu đề máy chủ làPOSTGRESQL7.2. VìPostgreSQL7.1 Bạn nên sử dụng--includedir.PG_CONFIGsẽ thoát với một

  • Khi phân bổ bộ nhớ, hãy sử dụngPostgreSQLthói quenPalloCPFREEThay vì tương ứngCThói quen thư việnmallocmiễn phí. Bộ nhớ được phân bổ bởiPalloCsẽ được giải phóng

  • Luôn luôn bằng không kèo bóng đá hom nay byte của cấu trúc của bạn bằng cách sử dụngMemsethoặcBzero. Một số thói quen (chẳng hạn như băm

  • Hầu hết kèo bóng đá hom nay bên trongPOSTGRESQLkèo bóng đá hom nay loại được khai báo trongPostgres.h, trong khi kèo bóng đá hom nay năngpg_function_args, v.v.)fmgr.h, vì vậy bạn sẽ cần phải bao gồm tạiPostgres.h Đầu tiên, trước bất kỳ ai khácPostgres.hcũng sẽ bao gồmELOG.Hpalloc.hcho bạn.

  • Tên biểu tượng được xác định trong kèo bóng đá hom nay tệp đối tượng không đượcPostgreSQLMáy chủ

  • biên dịch và liên kết mã đối tượng của bạn để có thểPostgreSQLLuôn yêu cầu đặc biệtPhần 9.5.8Để được giải thích chi tiết về cách làm cho bạn

9.5.8. Biên soạn

Trước khi bạn có thể sử dụngPostgreSQLkèo bóng đá hom nay chức năng mở rộng được viết trongThư viện chia sẻCần phải có

Để biết thêm thông tin, bạn nên đọc tài liệu củaCCvà Trình chỉnh sửa liên kết,LD. Ngoài ra,PostgreSQLMã nguồn chứa một sốĐóng gópThư mục. Nếu bạn dựa vào những ví dụ này, bạn sẽ làmPOSTGRESQLMã nguồn, tuy nhiên.

Tạo chia sẻMã độc lập vị trí(pic), về mặt khái niệm

Trong kèo bóng đá hom nay ví dụ sau, chúng tôi cho rằng mã nguồn của bạn làfoo.cvà chúng tôi sẽ tạo mộtfoo.so. kèo bóng đá hom nayfoo.oTrừ khi có ghi chú khác. Một thư viện được chia sẻ

BSD/OS

Cờ trình biên dịch để tạopic-FPIC. Cờ trình liên kết để tạo chia sẻ-shared.

GCC -FPIC -C FOO.C

Điều này được áp dụng kể từ phiên bản 4.0 củaBSD/OS.

FreeBSD

Cờ trình biên dịch để tạopic-FPIC. Để tạo kèo bóng đá hom nay thư viện được chia sẻ-shared.

GCC -FPIC -C FOO.C

Điều này được áp dụng như phiên bản 3.0 củaFreeBSD.

HP-UX

Cờ trình biên dịch của trình biên dịch hệ thống để tạopic+Z. Khi sử dụngGCCĐó là-FPIC. Cờ liên kết để chia sẻ-B. Vì thế

cc +z -c foo.c

hoặc

GCC -FPIC -C FOO.C

và sau đó

ld -b -o foo.sl foo.o

HP-UXSử dụng.SLđể chia sẻ

IRIX

piclà mặc định,-shared.

CC -C FOO.C
Linux

Cờ trình biên dịch để tạopic-FPIC. Trên một số nền tảng trong một số-FPICphải được sử dụng-FPICKhông hoạt động. Tham khảo-shared. Một ví dụ hoàn chỉnh trông giống như

cc -fpic -c foo.c
MacOS X

Đây là một mẫu. Nó giả định kèo bóng đá hom nay công cụ nhà phát triển là

CC -C FOO.C
NetBSD

Cờ trình biên dịch để tạopic-FPIC. VìelfHệ thống, trình biên dịch với-sharedđược sử dụng để liên kếtld -bsharableđược sử dụng.

GCC -FPIC -C FOO.C
OpenBSD

Cờ trình biên dịch để tạopic-FPIC. Ldđược sử dụng để liên kết kèo bóng đá hom nay thư viện được chia sẻ.

GCC -FPIC -C FOO.C
Solaris

Cờ trình biên dịch để tạopic-KPICVới trình biên dịch mặt trời và-FPICvớiGCC. Để liên kết kèo bóng đá hom nay thư viện chia sẻ,-gvới-sharedvớiGCC.

CC -KPIC -C FOO.C

hoặc

GCC -FPIC -C FOO.C
TRU64 UNIX

piclà mặc định,LDvới kèo bóng đá hom nay tùy chọn đặc biệt được sử dụng để thực hiện

CC -C FOO.C

Quy trình tương tự được sử dụng với GCC thay vì

Unixware

Cờ trình biên dịch để tạopic-KVới trình biên dịch SCO và-FPICvớiGCC. Để liên kết kèo bóng đá hom nay thư viện chia sẻ,-gvới-sharedvớiGCC.

cc -k pic -c foo.c

hoặc

GCC -FPIC -C FOO.C

Tip:Nếu bạn muốn đóng gói tiện ích mở rộng của mìnhgnu libtoolcho

Tệp thư viện chia sẻ kết quả sau đó có thể được tải vàoPostgreSQL. Khi chỉ địnhTạo kèo bóng đá hom nay năngLệnh, người ta phải đặt tên cho tệp thư viện được chia sẻ,.sohoặc.SL) có thểTạo kèo bóng đá hom nay năngLệnh và thông thường nên được bỏ qua để tốt nhất

Tham khảo lạiPhầnGiới thiệu về nơi máy chủ mong đợi tìm được chia sẻ