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 đá euro phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

35.11. kèo bóng đá euro loại do người dùng xác định

như được mô tả trongPhần 35.2, PostgreSQLcó thể được mở rộng để hỗ trợ kèo bóng đá euro loại dữ liệu mới. Phần này mô tả cách xác định kèo bóng đá euro loại cơ sở mới, là kèo bóng đá euro loại dữ liệu được xác định dưới mức củaSQLNgôn ngữ. Tạo một loại cơ sở mới yêu cầu thực hiện kèo bóng đá euro chức năng để hoạt động trên loại bằng ngôn ngữ cấp thấp, thường là C.

kèo bóng đá euro ví dụ trong phần này có thể được tìm thấy trongComplex.sqlphức tạp.ctrongSRC/Hướng dẫnThư mục phân phối nguồn. XemreadmeTệp trong thư mục đó cho kèo bóng đá euro hướng dẫn về chạy kèo bóng đá euro ví dụ.

Một loại do người dùng xác định phải luôn có kèo bóng đá euro chức năng đầu vào và đầu ra. kèo bóng đá euro chức năng này xác định cách loại xuất hiện trong chuỗi (cho đầu vào của người dùng và đầu ra cho người dùng) và cách sắp xếp loại trong bộ nhớ.

Giả sử chúng ta muốn xác định một kèo bóng đá europhức tạpđại diện cho kèo bóng đá euro số phức. Một cách tự nhiên để biểu diễn một số phức trong bộ nhớ sẽ là cấu trúc C sau:

Typedef Struct Complex

Chúng ta sẽ cần phải biến kèo bóng đá euro này thành một tham chiếu, vì nó quá lớn để phù hợp với mộtDatumGiá trị.

Là biểu diễn chuỗi bên ngoài của kèo bóng đá euro, chúng tôi chọn một chuỗi của biểu mẫu(x, y).

kèo bóng đá euro hàm đầu vào và đầu ra thường không khó để viết, đặc biệt là chức năng đầu ra. Nhưng khi xác định biểu diễn chuỗi bên ngoài của loại, hãy nhớ rằng cuối cùng bạn phải viết trình phân tích cú pháp hoàn chỉnh và mạnh mẽ cho biểu diễn đó làm chức năng đầu vào của bạn.

pg_function_info_v1 (Complex_in);

Hàm đầu ra có thể chỉ là:

pg_function_info_v1 (Complex_out);

Bạn nên cẩn thận để thực hiện kèo bóng đá euro hàm đầu vào và đầu ra nghịch đảo của nhau. Nếu bạn không, bạn sẽ gặp vấn đề nghiêm trọng khi bạn cần gửi dữ liệu của mình vào một tệp và sau đó đọc lại. Đây là một vấn đề đặc biệt phổ biến khi có liên quan đến số điểm nổi.

Tùy chọn, loại do người dùng xác định có thể cung cấp kèo bóng đá euro thói quen đầu vào và đầu ra nhị phân. I/O nhị phân thường nhanh hơn nhưng ít di động hơn I/O văn bản.phức tạp, chúng tôi sẽ cõng trên kèo bóng đá euro bộ chuyển đổi I/O nhị phân cho loạifloat8:

pg_function_info_v1 (Complex_Recv);

Một khi chúng tôi đã viết kèo bóng đá euro hàm I/O và biên dịch chúng thành một thư viện dùng chung, chúng tôi có thể xác địnhphức tạpkèo bóng đá euro trong SQL. Đầu tiên chúng tôi khai báo nó là kèo bóng đá euro shell:

Tạo kèo bóng đá euro phức tạp;

Điều này đóng vai trò là người giữ chỗ cho phép chúng tôi tham chiếu loại trong khi xác định kèo bóng đá euro chức năng I/O của nó. Bây giờ chúng ta có thể xác định kèo bóng đá euro chức năng I/O:

Tạo chức năng Complex_in (cString)FileName'FileName'FileName'FileName'

Cuối cùng, chúng ta có thể cung cấp định nghĩa đầy đủ về kiểu dữ liệu:

Tạo kèo bóng đá euro phức tạp (

Khi bạn xác định kèo bóng đá euro cơ sở mới,PostgreSQLTự động cung cấp hỗ trợ cho kèo bóng đá euro mảng thuộc loại đó. Loại mảng thường có cùng tên với loại cơ sở với ký tự dấu gạch dưới (_) Chuẩn bị.

Một khi loại dữ liệu tồn tại, chúng ta có thể khai báo kèo bóng đá euro chức năng bổ sung để cung cấp kèo bóng đá euro hoạt động hữu ích trên kiểu dữ liệu. kèo bóng đá euro toán tử sau đó có thể được xác định trên đỉnh kèo bóng đá euro chức năng và nếu cần, kèo bóng đá euro lớp toán tử có thể được tạo để hỗ trợ lập chỉ mục của kiểu dữ liệu.

Nếu kèo bóng đá euro giá trị của kiểu dữ liệu của bạn khác nhau về kích thước (ở dạng nội bộ), bạn nên tạo kiểu dữ liệubánh mì nướng-able (xemPhần 59.2). Bạn nên làm điều này ngay cả khi dữ liệu luôn quá nhỏ để được nén hoặc lưu trữ bên ngoài, vìPostgreSQL: Tàicũng có thể tiết kiệm không gian trên dữ liệu nhỏ, bằng cách giảm chi phí tiêu đề.

Để làm điều này, biểu diễn bên trong phải tuân theo bố cục tiêu chuẩn cho dữ liệu có độ dài thay đổi: Bốn byte đầu tiên phải làChar [4]Trường không bao giờ được truy cập trực tiếp (được đặt tên thông thườngVL_LEN_). Bạn phải sử dụngset_varsize ()Để lưu trữ kích thước của mốc thời gian trong trường này vàvarsize ()để lấy nó. kèo bóng đá euro chức năng C hoạt động trên kiểu dữ liệu phải luôn cẩn thận để giải nén bất kỳ giá trị nướng nào mà chúng được trao, bằng cách sử dụngpg_detoast_datum. (Chi tiết này được ẩn theo thông thường bằng cách xác định kèo bóng đá euro cụ thểgetarg_datatype_pmacros.) Sau đó, khi chạyTạo kèo bóng đá eurolệnh, chỉ định độ dài bên trong làbiếnvà chọn tùy chọn lưu trữ thích hợp.

Nếu căn chỉnh là không quan trọng (chỉ cho một hàm cụ thể hoặc vì kiểu dữ liệu chỉ định căn chỉnh byte bằng mọi cách) thì có thể tránh được một số chi phí củapg_detoast_datum. Bạn có thể sử dụngpg_detoast_datum_packedThay vào đó (theo thông thường được ẩn bằng cách kèo bóng đá euroGetArg_Datatype_ppMacro) và sử dụng macroVarsize_any_exhdrVardata_anyĐể truy cập một mốc dữ liệu có khả năng đóng gói. Một lần nữa, dữ liệu được trả về bởi kèo bóng đá euro macro này không được căn chỉnh ngay cả khi định nghĩa kiểu dữ liệu chỉ định căn chỉnh.pg_detoast_datumGiao diện.

Lưu ý:Mã cũ thường xuyên khai báoVL_LEN_như mộtINT32trường thay vìChar [4]. Điều này ổn miễn là định nghĩa cấu trúc có kèo bóng đá euro trường khác có ít nhấtINT32Căn chỉnh. Nhưng thật nguy hiểm khi sử dụng một định nghĩa cấu trúc như vậy khi làm việc với một mốc dữ liệu có khả năng không được sắp xếp;

Để biết thêm chi tiết, hãy xem mô tả củaTạo kèo bóng đá eurolệnh.