Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL lưu trữ thủ tục so với chức năng, tôi sẽ sử dụng cái nào khi nào?

Sự khác biệt chung nhất giữa các thủ tục và hàm là chúng được gọi khác nhau và cho các mục đích khác nhau:

  1. Một thủ tục không trả về 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.
  2. Một hàm được gọi trong một biểu thức và trả về một giá trị duy nhất trực tiếp cho trình gọi sẽ được sử dụng trong biểu thức.
  3. Bạn không thể gọi một hàm bằng câu lệnh CALL, cũng như không thể gọi một thủ tục trong một biểu thức.

Cú pháp tạo quy trình hơi khác đối với các thủ tục và hàm:

  1. Các tham số thủ tục có thể được xác định 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 trình 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 theo sau câu lệnh CALL. Các hàm chỉ có các tham số đầu vào. Do đó, mặc dù cả thủ tục và hàm đều có thể có tham số, nhưng khai báo tham số thủ tục khác với khai báo cho các hàm.
  2. Các hàm trả về giá trị, vì vậy 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ề một giá trị cho trình gọi. RETURNS và RETURN không xuất hiện trong định nghĩa thủ tục.

    • Để gọi một thủ tục đã lưu trữ, hãy sử dụng câu lệnh CALL statement . Để gọi một hàm được lưu trữ, hãy tham chiếu đến 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âu lệnh CALL và chỉ có thể trả lại các giá trị bằng cách sử dụ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ề một giá trị vô hướng.

    • Việc chỉ định một tham số là IN, OUT hoặc INOUT chỉ hợp lệ cho một THỦ TỤC. Đối với một FUNCTION, 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 tên tham số, thì đó là tham số IN theo mặc định. Tham số cho các hàm được lưu trữ không được đặt 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 THỦ TỤC 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

Phần mở rộng MySQL cho thủ tục được lưu trữ (không phải 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à trình gọi xử lý theo cùng một cách với kết quả của một câu lệnh SELECT. Tuy nhiên, nội dung của các tập kết quả đó không thể được sử dụng trực tiếp trong biểu thức.

Quy trình được lưu trữ (đề cập đến cả các thủ tục được lưu trữ và các hàm được lưu trữ) được liên kết với một cơ sở dữ liệu cụ thể, giống như bảng hoặc dạng xem. Khi bạn thả cơ sở dữ liệu, mọi quy trình được lưu trữ trong cơ sở dữ liệu cũng bị loại bỏ.

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 trùng tên trong cơ sở dữ liệu.

Trong thủ tục được lưu trữ, SQL động có thể được sử dụng nhưng không được sử dụng trong các hàm hoặc trình kích hoạt.

Các câu lệnh được chuẩn bị sẵn trong 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 sử dụng trong các hàm hoặc trình kích hoạt được lưu trữ. Do đó, các hàm và trình kích hoạt được lưu trữ không thể sử dụng Dynamic SQL (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 quy trình lưu trữ MySQL )

Một số điểm khác biệt thú vị giữa CHỨC NĂNG và QUY TRÌNH ĐƯỢC LƯU TRỮ:

  1. ( Điểm này là được sao chép từ một bài đăng trên blog . ) Thủ tục được lưu trữ là kế hoạch thực thi được biên dịch trước khi các chức năng không có. Hàm được phân tích cú pháp và biên dịch trong thời gian chạy. Thủ tục đượ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 đã biên dịch.

  2. ( Tôi không chắc về điểm này. )
    Thủ tục được lưu trữ có tính bảo mật và giảm lưu lượng mạng và chúng ta cũng có thể gọi thủ tục được lưu trữ trong bất kỳ số nào. ứng dụng tại một thời điểm. tham chiếu

  3. Các hàm thường được sử dụng cho các tính toán trong đó các quy trình asprocedures thường được sử dụng để thực thi logic nghiệp vụ.

  4. Chức năng Không thể ảnh hưởng đến trạng thái của cơ sở dữ liệu (Các câu lệnh thực hiện cam kết hoặc khôi phục rõ ràng hoặc ngầm định không được phép trong chức năng) Trong khi đó, các thủ tục được lưu trữ Có thể ảnh hưởng đến trạng thái của cơ sở dữ liệu bằng cách sử dụng cam kết, v.v.
    refrence: J.1. Các hạn chế đối với các quy trình và trình kích hoạt được lưu trữ

  5. Các hàm không thể sử dụng FLUSH trong khi đó các thủ tục được lưu trữ có thể thực hiện được.

  6. Các hàm được lưu trữ không thể đệ quy trong khi các thủ tục đã lưu trữ có thể được Lưu ý:Các thủ tục đượ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 một giá trị khác. Xem Phần 5.2.3 , “Biến hệ thống” , để biết thêm thông tin.

  7. Trong một hàm hoặc trình kích hoạt được lưu trữ, không được phép sửa đổi bảng đã được sử dụng (để đọc hoặc ghi) bởi câu lệnh đã gọi hàm hoặc trình kích hoạt. Ví dụ hay: Làm cách nào để cập nhật cùng một bảng khi xóa trong MYSQL?

Lưu ý :mặc dù một số hạn chế thường áp dụng cho các hàm và trình kích hoạt được lưu trữ nhưng không áp dụng cho các thủ tục được lưu trữ, những hạn chế đó áp dụng cho các thủ tục được lưu trữ nếu chúng được gọi từ bên trong một hàm 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 thủ tục được lưu trữ như vậy không thể được gọi từ một hàm hoặc trình kích hoạt được lưu trữ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL tải các giá trị NULL từ dữ liệu CSV

  2. Viết lại lựa chọn mysql để giảm thời gian và ghi tmp vào đĩa

  3. Tạo ứng dụng web từ Scratch bằng Python Flask và MySQL:Phần 3

  4. PHP - Sử dụng PDO với mảng mệnh đề IN

  5. TẢI THÔNG TIN DỮ LIỆU Mã lỗi:13