Tất cả các cuộc gọi đến các chức năng được viết bằng kèo chấp bóng đá hôm nay ngôn ngữ khác ngoài hiện tạiPhiên bản 1HồiGiao diện cho các kèo chấp bóng đá hôm nay ngữ được biên dịch (điều này bao gồm các hàm trong các kèo chấp bóng đá hôm nay ngữ và hàm thủ tục do người dùng xác địnhHandler gọiHàm cho ngôn ngữ cụ thể. Trình xử lý cuộc gọi là thực thi chức năng là kèo chấp bóng đá hôm nay cách có ý nghĩa, chẳng hạn như bằng cách diễn giải văn bản nguồn được cung cấp. Chương này phác thảo làm thế nào kèo chấp bóng đá hôm nay trình xử lý cuộc gọi của kèo chấp bóng đá hôm nay ngôn ngữ thủ tục mới có thể được viết.
Trình xử lý cuộc gọi cho kèo chấp bóng đá hôm nay làHồibình thườngHồiHàm phải được viết bằng kèo chấp bóng đá hôm nay ngữ được biên dịch như C, sử dụng giao diện phiên bản-1 và được đăng ký vớiPostgreSQLnhư không có đối số và trả về loạikèo chấp bóng đá hôm nay_handler
. Loại giả đặc biệt này xác định chức năng là 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. Để biết thêm chi tiết về các quy ước gọi kèo chấp bóng đá hôm nay ngữ C và tải động, xemPhần 37.9.
Trình xử lý cuộc gọi được gọi theo cùng kèo chấp bóng đá hôm nay cách như bất kỳ chức năng nào khác: Nó nhận được kèo chấp bóng đá hôm nay con trỏ tới AfunctionCallInfodata
struct
Chứa các giá trị và thông tin đối số về hàm được gọi và dự kiến sẽ trả về ADatum
Kết quả (và có thể đặtisnull
12682_12698functionCallInfodata
Cấu trúc, nếu nó muốn trả về kết quả SQL NULL). Sự khác biệt giữa trình xử lý cuộc gọi và hàm callee thông thường làflinfo- fn_oid
trường củafunctionCallInfodata
Cấ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 chính trình xử lý cuộc gọi. Trình xử lý cuộc gọi phải sử dụng trường này để xác định chức năng thực thi nào. Ngoài ra, danh sách đối số được thông qua đã được thiết lập theo khai báo của hàm đích, không phải của trình 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 hàm từPG_PROC
Danh mục hệ thống và để phân tích đối số và các loại trả về của hàm được gọi. TheAS
mệnh đề từTạo chức năng
Lệnh cho chức năng sẽ được tìm thấy trongprosrc
Cột củaPG_PROC
Hàng. Đây thường là văn bản nguồn trong ngôn ngữ thủ tục, nhưng trên lý thuyết, nó có thể là kèo chấp bóng đá hôm nay cái gì đó khác, chẳng hạn như tên đường dẫn đến kèo chấp bóng đá hôm nay tệp hoặc bất cứ điều gì khác cho người xử lý cuộc gọi phải làm gì kèo chấp bóng đá hôm nay cách chi tiết.
Thông thường, cùng kèo chấp bóng đá hôm nay hàm được gọi là nhiều lần cho mỗi câu lệnh SQL. Trình xử lý cuộc gọi có thể tránh tra cứu thông tin lặp đi lặp lại về chức năng được gọi bằng cách sử dụngflinfo- fn_extra
Trường. Điều này ban đầu sẽ lànull
, nhưng có thể được đặt bởi trình xử lý cuộc gọi để chỉ vào thông tin về hàm được gọi. Trên các cuộc gọi tiếp theo, nếuflinfo- fn_extra
đã khôngnull
Sau đó, nó có thể được sử dụng và bước tra cứu thông tin bị 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ớ sẽ sống ít nhất cho đến khi kết thúc truy vấn hiện tại, vì kèo chấp bóng đá hôm nayfmgrinfo
Cấu trúc dữ liệu có thể được giữ lâu như vậy. kèo chấp bóng đá hôm 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 đó thường sẽ có tuổi thọ giống nhưfmgrinfo
chính nó. Nhưng trình xử lý cũng có thể chọn sử dụng bối cảnh bộ nhớ tồn tại lâu hơn để có thể bộ đệm thông tin định nghĩa chức năng trên các truy vấn.
Khi hàm kèo chấp bóng đá hôm nay được gọi dưới dạng 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 ATriggerData
Cấu trúc, thay vì lànull
Vì nó là trong kèo chấp bóng đá hôm nay cuộc gọi chức năng đơn giản. kèo chấp bóng đá hôm nay người xử lý ngôn ngữ nên cung cấp các cơ chế cho các chức năng ngôn ngữ thủ tục để có được thông tin kích hoạt.
Đây là kèo chấp bóng đá hôm nay mẫu cho kèo chấp bóng đá hôm nay trình xử lý ngôn ngữ thủ tục được viết bằng 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" #ifdef pg_module_magic Pg_module_magic; #endif 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ủ tục kích hoạt */ TriggerData *TrigData = (TriggerData *) fcinfo- bối cảnh; retval = ... khác /* * Được gọi là kèo chấp bóng đá hôm nay 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 chức năng xử lý thành kèo chấp bóng đá hôm nay mô -đun có thể tải (xemPhần 37.9.5), Các lệnh sau sau đó đăng ký kèo chấp bóng đá hôm nay mẫu:
Tạo chức năng plsample_call_handler () trả về kèo chấp bóng đá hôm nay_handler
BẰNG 'FileName
'
kèo chấp bóng đá hôm nay ngữ C;
Tạo kèo chấp bóng đá hôm nay ngữ plsample
Handler plsample_call_handler;
Mặc dù cung cấp trình xử lý cuộc gọi là đủ để tạo ngôn ngữ thủ tục tối thiểu, có hai chức năng khác có thể được cung cấp tùy ý để làm cho ngôn ngữ thuận tiện hơn để sử dụng. Đây là kèo chấp bóng đá hôm nayValidatorvà kèo chấp bóng đá hôm nayHandler nội tuyến. kèo chấp bóng đá hôm nay trình xác nhận có thể được cung cấp để cho phép kiểm tra cụ thể ngôn ngữ được thực hiện trong thời gianTạo chức năng. kèo chấp bóng đá hôm nay trình xử lý nội tuyến có thể được cung cấp để cho phép ngôn ngữ hỗ trợ các khối mã ẩn danh được thực thi thông quadolệnh.
Nếu kèo chấp bóng đá hôm nay trình xác nhận được cung cấp bởi kèo chấp bóng đá hôm nay ngôn ngữ thủ tục, nó phải được khai báo là kèo chấp bóng đá hôm nay hàm lấy kèo chấp bóng đá hôm nay tham số duy nhấtoid
. Kết quả của trình xác nhận bị bỏ qua, do đó, nó được tuyên bố thông thường để trả vềvoid
. Trình xác nhận sẽ được gọi vào cuốiTạo chức năng
Lệnh đã tạo hoặc cập nhật kèo chấp bóng đá hôm nay hàm được viết bằng ngôn ngữ thủ tục. OID được truyền qua là oid của chức năngPG_PROC
Hàng. Trình xác thực phải tìm nạp hàng này theo cách thông thường và làm bất cứ điều gì kiểm tra là phù hợp. Đầu tiên, gọiCheckFunctionValidatorAccess ()
18482_18569tạo chức năng
18611_18931EREPORT ()
Cơ chế báo cáo lỗi. Ném kèo chấp bóng đá hôm nay lỗi sẽ buộc kèo chấp bóng đá hôm nay cuộc quay đầu lại giao dịch và do đó ngăn chặn định nghĩa chức năng không chính xác được thực hiện.
Các chức năng của trình xác thực thường tôn trọngCheck_Function_BodiesTham số: Nếu nó bị tắt thì bất kỳ kiểm tra đắt tiền hoặc nhạy cảm với bối cảnh nên được bỏ qua. Nếu kèo chấp bóng đá hôm nay ngữ cung cấp thực thi mã tại thời điểm biên dịch, trình xác nhận phải triệt tiêu các kiểm tra sẽ gây ra thực thi đó. Cụ thể, tham số này bị tắt bởipg_dump19597_20016Tạo chức năng
20058_20192Tạo chức năng
Mã chỉ thực thiset
mệnh đề được gắn vào kèo chấp bóng đá hôm nay hàm khiCheck_Function_Bodies
là trên. Do đó, kiểm tra kết quả của họ có thể bị ảnh hưởng bởi các tham số GUC chắc chắn nên được bỏ qua khiCheck_Function_Bodies
bị tắt, để tránh các lỗi sai khi tải lại kèo chấp bóng đá hôm nay bãi rác.
Nếu kèo chấp bóng đá hôm nay trình xử lý nội tuyến được cung cấp bởi kèo chấp bóng đá hôm nay ngôn ngữ thủ tục, nó phải được khai báo là kèo chấp bóng đá hôm nay hàm lấy kèo chấp bóng đá hôm nay tham số duy nhất loạiNội bộ
. Kết quả của người xử lý nội tuyến bị bỏ qua, do đó, nó được tuyên bố thông thường để trả vềvoid
. Trình xử lý nội tuyến sẽ được gọi khido
Câu lệnh được thực thi chỉ định ngôn ngữ thủ tục. Tham số thực sự được truyền là kèo chấp bóng đá hôm nay con trỏ tớiInLineCodeBlock
struct, chứa thông tin vềdo
tham số của câu lệnh, đặc biệt là văn bản của khối mã ẩn danh sẽ được thực thi. Trình xử lý nội tuyến nên thực thi mã này và trả về.
Bạn nên bọc tất cả các khai báo chức năng này, cũng nhưTạo kèo chấp bóng đá hôm nay ngữ
lệnh chính nó, thành kèo chấp bóng đá hôm nayMở rộngVì vậy, đơn giảnTạo tiện ích mở rộng
Lệnh là đủ để cài đặt kèo chấp bóng đá hôm nay ngữ. Nhìn thấyPhần 37.15Để biết thông tin về việc viết tiện ích mở rộng.
Các kèo chấp bóng đá hôm nay có trong phân phối tiêu chuẩn là các tài liệu tham khảo tốt khi cố gắng viết trình xử lý ngôn ngữ của riêng bạn. Nhìn vàoSRC/PL
Thư mục con của cây nguồn. TheTạo kèo chấp bóng đá hôm nay ngữTrang tham chiếu cũng có kèo chấp bóng đá hôm nay số chi tiết hữu ích.