Sự khác biệt chung nhất giữa các thủ tục và chức năng là chúng được gọi khác nhau và cho các mục đích khác nhau:
- Một thủ tục không trả về một giá trị. Thay vào đó, nó được gọi bằng câu lệnh CALL để thực hiện một thao tác như sửa đổi bảng hoặc xử lý các bản ghi đã truy xuất.
- Một hàm được gọi trong một biểu thức và trả về một giá trị trực tiếp cho người gọi sẽ được sử dụng trong biểu thức.
- Bạn không thể gọi hàm bằng câu lệnh CALL, cũng như không thể gọi thủ tục trong biểu thức.
Cú pháp để tạo thường trình khác nhau một chút cho các thủ tục và chức năng:
- Các tham số thủ tục có thể được định nghĩa là chỉ đầu vào, chỉ đầu ra hoặc cả hai. Điều này có nghĩa là một thủ tục có thể chuyển các giá trị trở lại cho người gọi bằng cách sử dụng các tham số đầu ra. Các giá trị này có thể được truy cập trong các câu lệnh tuân theo câu lệnh CALL. Các chức năng chỉ có các tham số đầu vào. Kết quả là, mặc dù cả hai thủ tục và hàm có thể có các tham số, khai báo tham số thủ tục khác với các hàm.
Hàm trả về giá trị, do đó phải có mệnh đề RETURNS trong định nghĩa hàm để chỉ ra kiểu dữ liệu của giá trị trả về. Ngoài ra, phải có ít nhất một câu lệnh RETURN trong thân hàm để trả về giá trị cho người gọi. TRẢ LẠI và TRẢ LẠI không xuất hiện trong định nghĩa thủ tục.
Để gọi một thủ tục được lưu trữ, sử dụng CALL statement
. Để gọi một hàm được lưu trữ, hãy tham khảo nó trong một biểu thức. Hàm trả về một giá trị trong quá trình đánh giá biểu thức.
Một thủ tục được gọi bằng cách sử dụng câu lệnh CALL và chỉ có thể trả lại các giá trị bằng các biến đầu ra. Một hàm có thể được gọi từ bên trong một câu lệnh giống như bất kỳ hàm nào khác (nghĩa là bằng cách gọi tên của hàm) và có thể trả về giá trị vô hướng.
Chỉ định tham số là IN, OUT hoặc INOUT chỉ hợp lệ cho THỦ TỤC. Đối với CHỨC NĂNG, các tham số luôn được coi là tham số IN.
Nếu không có từ khóa nào được đưa ra trước một tên tham số, thì đó là tham số IN theo mặc định.
Các tham số cho các chức năng được lưu trữ không đi trước IN, OUT hoặc INOUT. Tất cả các tham số chức năng được coi là tham số IN.
Để xác định một thủ tục hoặc hàm được lưu trữ, hãy sử dụng TẠO QUY TRÌNH hoặc TẠO CHỨC NĂNG tương ứng:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
Một phần mở rộng MySQL cho thủ tục được lưu trữ (không phải các hàm) là một thủ tục có thể tạo ra một tập kết quả hoặc thậm chí nhiều tập kết quả mà người gọi xử lý theo cách tương tự như kết quả của câu lệnh SELECT. Tuy nhiên, nội dung của các tập kết quả như vậy không thể được sử dụng trực tiếp trong biểu thức.
Các thói quen được lưu trữ (tham khảo cả các thủ tục được lưu trữ và các chức năng được lưu trữ) được liên kết với một cơ sở dữ liệu cụ thể, giống như các bảng hoặc dạng xem. Khi bạn thả cơ sở dữ liệu, mọi thói quen được lưu trữ trong cơ sở dữ liệu cũng sẽ bị hủy.
Các thủ tục và hàm được lưu trữ không chia sẻ cùng một không gian tên. Có thể có một thủ tục và một hàm có cùng tên trong cơ sở dữ liệu.
Trong thủ tục lưu trữ, SQL động có thể được sử dụng nhưng không phải trong các hàm hoặc trình kích hoạt.
Các câu lệnh được chuẩn bị SQL (PREPARE, EXECUTE, DEALLOCATE PREPARE) có thể được sử dụng trong các thủ tục được lưu trữ, nhưng không được lưu trữ các hàm hoặc trình kích hoạt. Do đó, các hàm và trình kích hoạt được lưu trữ không thể sử dụng SQL động (nơi bạn xây dựng các câu lệnh dưới dạng chuỗi và sau đó thực thi chúng). (SQL động trong các thói quen lưu trữ MySQL)
Một số khác biệt thú vị hơn giữa THỦ TỤC CHỨC NĂNG và BẢO QUẢN:
( Điểm này được sao chép từ một blogpost . ) Thủ tục được lưu trữ được biên dịch trước kế hoạch thực hiện trong khi chức năng thì không. Chức năng Phân tích cú pháp và biên dịch trong thời gian chạy. Thủ tục lưu trữ, Được lưu trữ dưới dạng mã giả trong cơ sở dữ liệu tức là biểu mẫu được biên dịch.
( Tôi không chắc chắn về điểm này. )
Thủ tục lưu trữ có bảo mật và giảm lưu lượng mạng và chúng tôi cũng có thể gọi thủ tục được lưu trữ trong bất kỳ không. của các ứng dụng tại một thời điểm. tài liệu tham khảo
Các hàm thường được sử dụng để tính toán trong đó các thủ tục thường được sử dụng để thực hiện logic nghiệp vụ.
Chức năng không thể ảnh hưởng đến trạng thái của cơ sở dữ liệu (báo cáo rằng làm rõ ràng hoặc ngầm cam kết hoặc rollback là không được phép trong chức năng) Trong khi đó, các thủ tục lưu trữ có thể ảnh hưởng đến trạng thái của cơ sở dữ liệu sử dụng cam kết, vv
refrence: J.1. Hạn chế về các thói quen và kích hoạt được lưu trữ
Các hàm không thể sử dụng các câu lệnh FLUSH trong khi các thủ tục được lưu có thể làm.
Các chức năng được lưu trữ không thể được đệ quy trong khi các thủ tục được lưu trữ có thể được. Lưu ý: Các thủ tục lưu trữ đệ quy bị tắt theo mặc định, nhưng có thể được bật trên máy chủ bằng cách đặt biến hệ thống máy chủ max_sp_recursion_depth thành giá trị khác không. Xem Phần 5.2.3, Hệ thống Biến Biến , để biết thêm thông tin.
Trong một chức năng được lưu trữ hoặc kích hoạt, không được phép sửa đổi một bảng đã được sử dụng (để đọc hoặc viết) bởi câu lệnh đã gọi hàm hoặc kích hoạt. Ví dụ hay: Làm thế nào để cập nhật cùng một bảng về xóa trong MYSQL?
Lưu ý : mặc dù một số hạn chế thường áp dụng cho các chức năng và trình kích hoạt được lưu trữ nhưng không áp dụng cho các quy trình được lưu trữ, những hạn chế đó sẽ áp dụng cho các quy trình được lưu trữ nếu chúng được gọi từ bên trong một chức năng hoặc trình kích hoạt được lưu trữ. Ví dụ: mặc dù bạn có thể sử dụng FLUSH trong một thủ tục được lưu trữ, nhưng một thủ tục được lưu trữ như vậy có thể được gọi từ một hàm hoặc trình kích hoạt được lưu trữ.