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

Chương 46. Viết a Người xử lý kèo chấp bóng đá hôm nay

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ữ 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 chấp bóng đá hôm 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 chấp bóng đá hôm 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 chấp bóng đá hôm nay ngữ có thể được viết.

Trình xử lý cuộc gọi cho kèo chấp bóng đá hôm nay là"Bình thường"Hàm phải được viết trong A đã biên dịch kèo chấp bóng đá hôm 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 chấp bóng đá hôm nay_handler11598_11731

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 một 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à một 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_PROCvà Để 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_PROCHàng. Điều này là phổ biến văn bản nguồn bằng kèo chấp bóng đá hôm 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ố. Một 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ànull13683_13801flinfo- 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. Một 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 chấp bóng đá hôm 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 chấp bóng đá hôm nay ngữ nên cung cấp các cơ chế cho Các chức năng về kèo chấp bóng đá hôm 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 chấp bóng đá hôm 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 chấp bóng đá hôm 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 một tải có thể tải Mô -đun (xemPhần 32.9.6), The Các lệnh sau sau đó đăng ký thủ tục mẫu kèo chấp bóng đá hôm nay ngữ:

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;

Các kèo chấp bóng đá hôm 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.