Sự khác biệt giữa các thủ tục được lưu trữ của người dùng ở đâu


36

Vì vậy, một nhận xét từ câu hỏi này đề cập rằng, có một sự khác biệt nhỏ trong "Thủ tục lưu trữ" và "Các chức năng được lưu trữ" trong PostgreQuery.

Nhận xét liên kết đến một bài viết trên wikipedia nhưng một số điều này dường như không áp dụng (ví dụ: chúng có thể được sử dụng trong một SELECTtuyên bố).

Các cú pháp riêng của mình dường như là một chút bối rối:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Bạn tạo một FUNCTIONnhưng gọi nó là a PROCEDURE.

Vậy sự khác biệt giữa hai điều này là gì?

Câu trả lời:


43

Chính thức, PostgreSQL chỉ có "chức năng". Các chức năng kích hoạt đôi khi được gọi là "quy trình kích hoạt", nhưng việc sử dụng đó không có ý nghĩa riêng biệt. Trong nội bộ, các chức năng đôi khi được gọi là các thủ tục, chẳng hạn như trong danh mục hệ thống pg_proc. Đó là một sự tiếp quản từ PostQUEL. Bất kỳ tính năng nào mà một số người (có thể có kinh nghiệm trong các hệ thống cơ sở dữ liệu khác nhau) có thể liên kết với các quy trình, chẳng hạn như mức độ liên quan của họ để ngăn chặn việc tiêm SQL hoặc sử dụng các tham số đầu ra, cũng áp dụng cho các chức năng như chúng tồn tại trong PostgreQuery.

Tuy nhiên, bây giờ, khi mọi người trong cộng đồng PostgreQuery nói về "các thủ tục được lưu trữ" hoặc "các thủ tục được lưu trữ thực sự", tuy nhiên, họ thường có nghĩa là một tính năng giả định của một đối tượng giống như chức năng có thể bắt đầu và dừng các giao dịch trong cơ thể của nó, một số chức năng hiện tại không thể làm Việc sử dụng thuật ngữ "thủ tục lưu trữ" trong ngữ cảnh này dường như tương tự với các sản phẩm cơ sở dữ liệu khác. Xem chủ đề danh sách gửi thư này cho một ý tưởng mơ hồ.

Tuy nhiên, trên thực tế, sự khác biệt về chức năng này so với thủ tục về khả năng kiểm soát giao dịch của chúng không được chấp nhận phổ biến và chắc chắn nhiều lập trình viên không có sai lệch cơ sở dữ liệu sẽ coi một thủ tục giống như Pascal là một hàm không có giá trị trả về. (Tiêu chuẩn SQL dường như có một nền tảng trung gian, trong đó một thủ tục theo mặc định có hành vi giao dịch khác với chức năng, nhưng điều này có thể được điều chỉnh cho mỗi đối tượng.) Vì vậy, trong mọi trường hợp và đặc biệt là khi xem xét các câu hỏi trên Stack Exchange với một đối tượng rất hỗn hợp, bạn nên tránh giả định quá nhiều và sử dụng các thuật ngữ rõ ràng hơn hoặc xác định các thuộc tính mà bạn mong đợi.


14

Về mặt DDL, Postgres không có các đối tượng thủ tục, chỉ có các hàm. Các hàm Postgres có thể trả về (các) giá trị hoặc khoảng trống để chúng đảm nhận vai trò của cả hai hàm và thủ tục trong các RDBMS khác. Từ 'thủ tục' trong phần create triggerchỉ một chức năng.

Về mặt tài liệu Postgres, 'thủ tục' cũng là một từ đồng nghĩa với đối tượng cơ sở dữ liệu được gọi là hàm, ví dụ: " Một thủ tục kích hoạt được tạo bằng lệnh CREATE FUNCTION ".

Kích hoạt 'thủ tục' có quy tắc cụ thể: chúng phải được khai báo là hàm không có đối số và loại kích hoạt trả về . Ví dụ ở đây .


8

Các thuật ngữ "thủ tục được lưu trữ" và "chức năng được lưu trữ" được sử dụng thay thế cho nhau trong PostgreSQL và thường được hiểu là cùng một điều. Các cơ sở dữ liệu khác có thể phân biệt giữa một thủ tục và hàm (giống như cách VB phân biệt giữa các chương trình con và hàm).

Miễn là một hàm trong PostgreSQL trả về một cái gì đó giống với bảng, bạn có thể sử dụng đầu ra của hàm đó như thể nó là một bảng tiêu chuẩn. Các CREATE TRIGGERcú pháp là một chút bối rối, nhưng tôi nghi ngờ nó có thể đã được đưa ra trước khi các tiêu chuẩn ANSI được hoàn thiện. Tôi chỉ có một bản sao của SQL: 2003, vì vậy tôi không thể làm gì nhiều hơn là suy đoán tại sao danh pháp là lạ.

Phiên bản TL; DR: với "thủ tục" PostgreSQL tương đương với "hàm".


6

Trong MSSQL, một thủ tục được lưu trữ là một tập hợp các lệnh sql được biên dịch trước.
Một thủ tục được lưu trữ:

 - có thể có nhiều tham số đầu vào và đầu ra
 - có thể được sử dụng để sửa đổi bảng / cấu trúc / dữ liệu cơ sở dữ liệu
 - thường không được sử dụng bên trong các câu lệnh insert / update / xóa / select
Các chức năng do người dùng xác định có nhiều loại. Tùy thuộc vào loại chức năng viết, chức năng:
  - có thể có nhiều tham số đầu vào, nhưng chỉ trả về một giá trị duy nhất (nghĩa là nối chuỗi)
  - có thể chấp nhận một tập hợp làm đầu vào, trả về một giá trị duy nhất (ví dụ: dbo.FindLargestPig (ListOfPigs))
  - trả về một bảng (tức là chọn * từ dbo.ExplodeString ("đây là danh sách các từ"))
  - có thể được sử dụng trong các câu lệnh select / insert / update / xóa
  - CANNOT được sử dụng để sửa đổi bảng / cấu trúc / dữ liệu cơ sở dữ liệu


5

Câu trả lời ngắn gọn là một hàm trả về một giá trị, nhưng một thủ tục thì không.

Sự khác biệt đó đã có trong các Mô-đun được lưu trữ liên tục (SQL / PSM), được đề xuất cho SQL 1992. Tôi không biết liệu SQL / PSM có được đưa vào các tiêu chuẩn hay không.


vào năm 2003 tôi tin rằng
xenoterracide

Nghe có vẻ đáng chú ý như cú pháp cho VB. Hàm trả về một giá trị và một thủ tục không (vì vậy nếu bạn có giá trị trả về trong hàm thì nó sẽ nổ tung trên trình biên dịch)
jcolebrand

@jcolebrand Trên thực tế, các tên rõ ràng hơn trong Pascal. Một thủ tục không trả về kết quả, trong khi một hàm thực hiện. Vì lý do lịch sử, VBA sử dụng ngôn ngữ của FORTRAN, họ gọi (được gọi là?) Họ ĐĂNG KÝ & CHỨC NĂNG . Các ngôn ngữ loại C hiện đại chỉ có các chức năng, nhưng các ngôn ngữ được nhập có tùy chọn các hàm void là các thủ tục theo tên khác. Một xu hướng phổ biến là chỉ sử dụng các chức năng bình thường cho mọi thứ và trả lại một cái gì đó có thể bị bỏ qua nếu bạn muốn.
Manngo

2

So sánh câu trả lời được chấp nhận từ cấp độ khái niệm trừu tượng, tôi hiểu sự khác biệt từ chức năng và quan điểm đầu vào / đầu ra. Dưới đây tôi đã sử dụng sp và f để thể hiện thủ tục và chức năng được lưu trữ, tương ứng.

  1. Sử dụng trong một biểu thức: sp không thể được sử dụng trong một biểu thức trong khi hàm có thể, có nghĩa là bạn có thể sử dụng giá trị trả về của mình từ af bên trong các câu lệnh khác, như

    select * 
    from table 
    where col_a < (select col_A from f())
  2. trả về giá trị: sp không tự động trả về một giá trị, trừ khi bạn chỉ định refcursor kiểu trả về, cởi mở và trả về một con trỏ; f trả về kết quả trong câu lệnh cuối cùng trong đó mệnh đề 'return' được nhúng, giống như mệnh đề select .

  3. trả về các tập kết quả đơn / nhiều: ở đây các tập kết quả đề cập đến một danh sách các kết quả có thể khác nhau về định dạng, như tập hợp số nguyên đơn, mảng văn bản và hai bảng. sp có thể trả về nhiều bộ miễn là bạn chỉ định loại trả về của người giới thiệu, mở và trả về một con trỏ. Tuy nhiên, f chỉ có thể trả về một loại tập hợp.

Thông thường, các thủ tục được lưu trữ được sử dụng để sửa đổi dữ liệu hoặc cấu trúc cơ sở dữ liệu không cần giá trị trả về, như xóa, cập nhật, thả , v.v; hoặc các tình huống trong đó nhiều bộ kết quả được yêu cầu. Mặt khác, chức năng hầu hết được chọn cho các truy vấn đơn giản.

Để biết thêm chi tiết về lời giải thích của tôi, vui lòng tham khảo liên kết này: Các thủ tục và chức năng được lưu trữ trong PostgreQuery

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.