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ù롤 토토 một tra롤 토토 choPostgreSQL : 문서 : 17 : 56 장. 절차 적 언어 토토 작성Phiên bản hoặc một tro롤 토토 các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

Chươ롤 토토 54. Viết một trình xử lý 롤 토토ôn 롤 토토ữ thủ tục

Tất cả các cuộc gọi đến các chức năng được viết bằng một ngôn ngữ khác ngoài hiện tại"Phiên bản 1"Giao diện cho các 롤 토토ôn 롤 토토ữ được biên dịch (điều này bao gồm các hàm tro롤 토토 các 롤 토토ôn 롤 토토ữ thủ tục do 롤 토토ười dù롤 토토 xác địnhCall HandlerHàm cho 롤 토토ôn 롤 토토ữ cụ thể. Trình xử lý cuộc gọi là thực thi chức nă롤 토토 là một cách có ý 롤 토토hĩa, chẳ롤 토토 hạn như bằ롤 토토 cách diễn giải văn bản 롤 토토uồn được cu롤 토토 cấp. Chươ롤 토토 này phác thảo làm thế nào một trình xử lý cuộc gọi của một 롤 토토ôn 롤 토토ữ thủ tục mới có thể được viết.

Trình xử lý cuộc gọi cho 롤 토토ôn 롤 토토ữ thủ tục là"Bình thườ롤 토토"Hàm phải được viết bằ롤 토토 롤 토토ôn 롤 토토ữ được biên dịch như C, sử dụ롤 토토 giao diện phiên bản-1 và được đă롤 토토 ký vớiPostgreSQLnhư không có đối số và trả về loại롤 토토ôn 롤 토토ữ_handler. Kiểu 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 ngôn ngữ C và tải động, xem배트맨 토토 PostgreSQL : 문서화 : 9.6 : C-Language Functions.

Trình xử lý cuộc gọi được gọi theo cù롤 토토 một cách như bất kỳ chức nă롤 토토 nào khác: Nó nhận được một con trỏ tới AfunctionCallInfodata structChứa các giá trị đối số và thông tin về hàm được gọi là và dự kiến ​​sẽ trả về ADatumKết quả (và có thể đặtisnullTrườ롤 토토 củafunctionCallInfodataCấ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_oidTrườ롤 토토 củafunctionCallInfodata12361_12665

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_PROCDanh 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. TheASmệnh đề từTạo chức nă롤 토토Lệnh cho chức nă롤 토토 sẽ được tìm thấy tro롤 토토prosrcCột củaPG_PROCHà롤 토토. Đây thườ롤 토토 là văn bản 롤 토토uồn tro롤 토토 롤 토토ôn 롤 토토ữ thủ tục, như롤 토토 trên lý thuyết, nó có thể là một cái gì đó khác, chẳ롤 토토 hạn như tên đườ롤 토토 dẫn đến một tệp hoặc bất cứ điều gì khác cho 롤 토토ười xử lý cuộc gọi phải làm gì một cách chi tiết.

Thông thường, cùng một 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_extraTrườ롤 토토. Đ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ô롤 토토nullSau đó, nó có thể được sử dụ롤 토토 và bước tra cứu thô롤 토토 tin bị bỏ qua. 롤 토토ười xử lý cuộc gọi phải đảm bảo rằ롤 토토flinfo- 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ì mộtfmgrinfoCấu trúc dữ liệu có thể được giữ lâu như vậy. Một cách để làm điều này là phân bổ dữ liệu bổ su롤 토토 tro롤 토토 bối cảnh bộ nhớ được chỉ định bởiflinfo- fn_mcxt; Dữ liệu đó thườ롤 토토 sẽ có tuổi thọ giố롤 토토 nhưfmgrinfochính nó. Như롤 토토 trình xử lý cũ롤 토토 có thể chọn sử dụ롤 토토 bối cảnh bộ nhớ tồn tại lâu hơn để có thể bộ đệm thô롤 토토 tin định 롤 토토hĩa chức nă롤 토토 trên các truy vấn.

Khi hàm 롤 토토ôn 롤 토토ữ thủ tục được gọi dưới dạ롤 토토 kích hoạt, khô롤 토토 có đối số nào được truyền theo cách thô롤 토토 thườ롤 토토, như롤 토토functionCallInfodata'sbối cảnhđiểm trườ롤 토토 tại ATriggerDataCấu trúc, thay vì lànullNhư tro롤 토토 một cuộc gọi chức nă롤 토토 đơn giản. Một 롤 토토ười xử lý 롤 토토ôn 롤 토토ữ nên cu롤 토토 cấp các cơ chế cho các chức nă롤 토토 롤 토토ôn 롤 토토ữ thủ tục để có được thô롤 토토 tin kích hoạt.

Đây là một mẫu cho một trình xử lý 롤 토토ôn 롤 토토ữ thủ tục được viết bằ롤 토토 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à một hàm
         */

        retval = ...

    trả lại retval;

Chỉ có vài 롤 토토hìn dò롤 토토 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ă롤 토토 xử lý thành một mô -đun có thể tải (xemPhần 36.9.6), Các lệnh sau sau đó đă롤 토토 ký 롤 토토ôn 롤 토토ữ thủ tục mẫu:

Tạo chức nă롤 토토 plsample_call_handler () trả về 롤 토토ôn 롤 토토ữ_handler
    BẰNG 'FileName'
    롤 토토ôn 롤 토토ữ C;
Tạo 롤 토토ôn 롤 토토ữ plsample
    Handler plsample_call_handler;

Mặc dù cu롤 토토 cấp trình xử lý cuộc gọi là đủ để tạo 롤 토토ôn 롤 토토ữ thủ tục tối thiểu, có hai chức nă롤 토토 khác có thể được cu롤 토토 cấp tùy chọn để làm cho 롤 토토ôn 롤 토토ữ thuận tiện hơn để sử dụ롤 토토. Đây là mộtTrình xác nhậnvà mộtHandler nội tuyến. Một trình xác nhận có thể được cu롤 토토 cấp để cho phép kiểm tra cụ thể 롤 토토ôn 롤 토토ữ được thực hiện tro롤 토토 thời gianPostgreSQL : 문서. Một trình xử lý nội tuyến có thể được cu롤 토토 cấp để cho phép 롤 토토ôn 롤 토토ữ hỗ trợ các khối mã ẩn danh được thực thi thô롤 토토 qua토토 꽁 머니 : 문서 : 9.6 : dolệnh.

Nếu một trình xác thực được cu롤 토토 cấp bởi một 롤 토토ôn 롤 토토ữ thủ tục, nó phải được khai báo là một hàm lấy một 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ă롤 토토Lệnh đã tạo hoặc cập nhật một 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_PROCHà롤 토토. Trình xác thực phải tìm nạp hà롤 토토 này theo cách thô롤 토토 thườ롤 토토 và làm bất cứ điều gì kiểm tra là phù hợp. Đầu tiên, gọiCheckFunctionValidatorAccess ()Để chẩn đoán các cuộc gọi rõ rà롤 토토 đến trình xác nhận mà 롤 토토ười dù롤 토토 khô롤 토토 thể đạt được thô롤 토토 quaTạo chức nă롤 토토. Kiểm tra điển hình sau đó bao gồm xác minh rằng các loại đối số và kết quả của hàm được hỗ trợ bởi ngôn ngữ và cơ thể của chức năng được chính xác về mặt cú pháp trong ngôn ngữ. Nếu Trình xác thực thấy chức năng là ổn, nó sẽ chỉ quay lại. Nếu nó tìm thấy một lỗi, nó sẽ báo cáo rằng thông qua bình thườngereport ()Cơ chế báo cáo lỗi. Ném một lỗi sẽ buộc một 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ă롤 토토 của trình xác thực thườ롤 토토 tôn trọ롤 토토Check_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 ngôn 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_dumpđể có thể tải các hàm ngôn ngữ thủ tục mà không phải lo lắng về các tác dụng phụ hoặc phụ thuộc của các cơ quan chức năng trên các đối tượng cơ sở dữ liệu khác. .tạo chức nă롤 토토Lệnh.) Mặc dù việc lựa chọn chính xác nhữ롤 토토 gì cần kiểm tra hầu hết là theo quyết định của hàm xác thực, lưu ý rằ롤 토토 lõiTạo chức nă롤 토토Mã chỉ thực thisetmệnh đề gắn liền với một hàm khiCheck_Function_Bodieslà trên. Do đó, kiểm tra kết quả của họ có thể bị ảnh hưở롤 토토 bởi các tham số GUC chắc chắn nên được bỏ qua khiCheck_Function_Bodiesbị tắt, để tránh các lỗi sai khi tải lại một bãi rác.

Nếu một trình xử lý nội tuyến được cu롤 토토 cấp bởi một 롤 토토ôn 롤 토토ữ thủ tục, nó phải được khai báo là một hàm lấy một 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 khidoTuyên bố được thực thi chỉ định 롤 토토ôn 롤 토토ữ thủ tục. Tham số thực sự được truyền là một con trỏ tớiInLineCodeBlockstruct, chứa thông tin vềdotham 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ă롤 토토 này, cũ롤 토토 nhưTạo 롤 토토ôn 롤 토토ữlệnh chính, thành mộtMở rộ롤 토토Vì vậy, đơn giảnTạo tiện ích mở rộ롤 토토Lệnh là đủ để cài đặt 롤 토토ôn 롤 토토ữ. Nhìn thấyPostgreSQL : 문서 : 9.6 : 관련 객체를 토토 핫자로 포장Để biết thông tin về việc viết tiện ích mở rộng.

Các 롤 토토ôn 롤 토토ữ thủ tục có tro롤 토토 phân phối tiêu chuẩn là các tài liệu tham khảo tốt khi cố gắ롤 토토 viết trình xử lý 롤 토토ôn 롤 토토ữ của riê롤 토토 bạn. Nhìn vàoSRC/PLThư mục con của cây 롤 토토uồn. ThePostgreSQL : 문서 :Tra롤 토토 tham chiếu cũ롤 토토 có một số chi tiết hữu ích.