Postgresql 8.4.22 Tài liệu | ||||
---|---|---|---|---|
prev | Backward nhanh | Chuyển tiếp nhanh | Tiếp theo |
Tất cả các cuộc gọi đến các chức năng được viết bằng kèo bóng đá hom nay ngữ khác hơn hiện tại"Phiên bản 1"Giao diện Đối với các ngôn ngữ được biên dịch (điều này bao gồm các chức năng trong định nghĩa người dùng kèo bóng đá hom nay, chức năng được viết bằng SQL và các chức năng Sử dụng giao diện ngôn ngữ được biên dịch phiên bản 0), đi quaHandler gọiHàm cho cụ thể kèo bóng đá hom nay ngữ. Trách nhiệm của người xử lý cuộc gọi là thực thi chức năng một cách có ý nghĩa, chẳng hạn như bằng cách diễn giải cung cấp văn bản nguồn. Chương này phác thảo cách một thủ tục mới Trình xử lý cuộc gọi của kèo bóng đá hom nay ngữ có thể được viết.
Trình xử lý cuộc gọi cho kèo bóng đá hom nay là"Bình thường"Hàm phải được viết trong A đã biên dịch kèo bóng đá hom nay ngữ như C, sử dụng giao diện phiên bản-1 và Đã đăng ký vớiPostgreSQLnhư Không có đối số và trả lại loạikèo bóng đá hom nay_handler. Kiểu mẫu đặc biệt này xác định chức năng như kèo bóng đá hom nay người xử lý cuộc gọi và ngăn không cho nó được gọi trực tiếp trong các lệnh sql.
Trình xử lý cuộc gọi được gọi theo cách tương tự như bất kỳ người nào khác Chức năng: Nó nhận được kèo bóng đá hom nay con trỏ tớifunctionCallInfodata structChứa các giá trị và thông tin đối số về hàm được gọi và dự kiến sẽ trả vềDatumKết quả (và có thể đặtisnulltrường củafunctionCallInfodatacấu trúc, nếu nó muốn trả về kết quả SQL NULL). Sự khác biệt giữa người xử lý cuộc gọi và kèo bóng đá hom nay hàm callee thông thường làflinfo- fn_oidTrường củafunctionCallInfodatacấu trúc sẽ chứa Oid của chức năng thực tế được gọi, không phải của người xử lý cuộc gọi chính nó. Người xử lý cuộc gọi phải sử dụng trường này để xác định cái nào chức năng để thực thi. Ngoài ra, danh sách đối số được thông qua đã được đặt lên theo tuyên bố của hàm mục tiêu, không phải người xử lý cuộc gọi.
Tùy thuộc vào trình xử lý cuộc gọi để lấy mục nhập của chức năng
Từ bảng hệ thốngPG_PROC
và
Để phân tích đối số và các loại trả về của hàm được gọi.
TheASmệnh đề từtạo chức nănglệnh cho chức năng sẽ
tìm thấy trongprosrcCột củaPG_PROC
Hàng. Điều này là phổ biến
văn bản nguồn bằng kèo bóng đá hom nay, nhưng về lý thuyết, nó có thể là
một cái gì đó khác, chẳng hạn như tên đường dẫn đến một tệp hoặc bất cứ thứ gì khác
nói với người xử lý cuộc gọi phải làm gì một cách chi tiết.
Thông thường, chức năng tương tự được gọi là nhiều lần cho mỗi SQL tuyên bố. kèo bóng đá hom nay người xử lý cuộc gọi có thể tránh các tra cứu lặp đi lặp lại thông tin về chức năng được gọi bằng cách sử dụngflinfo- fn_extraTrường. Điều này ban đầu sẽ lànull, nhưng có thể được đặt bởi cuộc gọi Trình xử lý để chỉ vào thông tin về chức năng được gọi. TRÊN Các cuộc gọi tiếp theo, nếuflinfo- fn_extrađã khôngnullSau đó, nó có thể được sử dụng và tra cứu thông tin Bước bỏ qua. Người xử lý cuộc gọi phải đảm bảo rằngflinfo- fn_extrađược thực hiện để chỉ vào bộ nhớ điều đó sẽ sống ít nhất cho đến khi kết thúc truy vấn hiện tại, vì MỘTfmgrinfoCấu trúc dữ liệu có thể Giữ lâu như vậy. kèo bóng đá hom nay cách để làm điều này là phân bổ dữ liệu bổ sung Trong bối cảnh bộ nhớ được chỉ định bởiflinfo- fn_mcxt; Dữ liệu như vậy sẽ bình thường có cùng tuổi thọ vớifmgrinfochính nó. Nhưng người xử lý cũng có thể chọn sử dụng bối cảnh bộ nhớ sống lâu hơn để có thể lưu trữ Thông tin định nghĩa chức năng trên các truy vấn.
Khi chức năng kèo bóng đá hom nay ngữ theo thủ tục được gọi như một kích hoạt, Không có đối số nào được truyền theo cách thông thường, nhưngfunctionCallInfodata'Sbối cảnhđiểm trường tại ATriggerDatacấu trúc, thay vì lànullVì nó là trong một cuộc gọi chức năng đơn giản. MỘT Trình xử lý kèo bóng đá hom nay ngữ nên cung cấp các cơ chế cho Các chức năng về kèo bóng đá hom nay ngữ theo quy trình để có được kích hoạt thông tin.
Đây là một mẫu cho một trình xử lý kèo bóng đá hom nay Trong c:
#include "Postgres.h" #include "Executor/spi.h" #include "Lệnh/Trigger.h" #include "fmgr.h" #include "Access/Heapam.h" #include "Utils/syscache.h" #include "Danh mục/pg_proc.h" #include "Danh mục/pg_type.h" Pg_function_info_v1 (plsample_call_handler); Mốc thời gian plsample_call_handler (pg_function_args) Datum retval; if (được gọi là_as_trigger (fcinfo)) /* * Được gọi là thủ kèo bóng đá hom nay kích hoạt */ TriggerData *TrigData = (TriggerData *) fcinfo- bối cảnh; retval = ... khác /* * Được gọi là một hàm */ retval = ... trả lại retval;
Chỉ có vài nghìn dòng mã phải được thêm vào thay vì các dấu chấm để hoàn thành trình xử lý cuộc gọi.
Sau khi biên dịch hàm xử lý thành kèo bóng đá hom nay tải có thể tải Mô -đun (xemPhần 34.9.6), The Các lệnh sau sau đó đăng ký thủ tục mẫu kèo bóng đá hom nay ngữ:
Tạo chức năng plsample_call_handler () trả về kèo bóng đá hom nay_handler BẰNG 'FileName' kèo bóng đá hom nay ngữ C; Tạo kèo bóng đá hom nay ngữ plsample Handler plsample_call_handler;
Các kèo bóng đá hom nay có trong phân phối tiêu chuẩn là những tài liệu tham khảo tốt khi cố gắng viết trình xử lý cuộc gọi của riêng bạn. Nhìn vàoSRC/PLthư mục con cây nguồn.