Mysql chứa chức năng
67 68 69 70 71 72 73 74 75 70 71 72 682 683 684 685 686 Create a functionTrong MySQL, Hàm cũng có thể được tạo. Một hàm luôn trả về một giá trị bằng cách sử dụng câu lệnh return. Hàm này có thể được sử dụng trong truy vấn SQL Nội dung chính Hiển thị
cú pháp
Tham sốTên chức năng. tên chức năng Tham số. tham số number. Có thể là một tham số hoặc nhiều hơn return_datatype. Kiểu dữ liệu giá trị được trả về, phần khai báo. Các biến được khai báo phần thực thi. Mã hàm được viết tại đây Ví dụ 1Bước 1. Create CSDL and bảng CSDL. Nhân viên Bảng 1. chỉ định Bảng 2. Nhân Viên Bước 2. Create a function Câu truy vấn trong hàm
Bước 3. Thi hàm Câu hỏi
Clear hàmIn MySQL function can also be delete, Hàm can could be delete from from cú pháp
Tham sốTên chức năng. Tên hàm sẽ bị xóa Ví dụ 1Xóa hàm tên là get_designation_name; 13. 1. 17 TẠO THỦ TỤC và TẠO CHỨC NĂNG Câu lệnh
Các câu lệnh này được sử dụng để tạo một thói quen được lưu trữ (một thủ tục hoặc chức năng được lưu trữ). Nghĩa là, quy trình được chỉ định sẽ được máy chủ biết đến. Theo mặc định, một thói quen được lưu trữ được liên kết với cơ sở dữ liệu mặc định. Để liên kết quy trình một cách rõ ràng với một cơ sở dữ liệu nhất định, hãy chỉ định tên là 84 khi bạn tạo nóCâu lệnh 0 cũng được sử dụng trong MySQL để hỗ trợ các chức năng có thể tải. Xem Phần 13. 7. 4. 1, “CREATE FUNCTION Statement for Loadable Functions”. Một chức năng có thể tải có thể được coi là một chức năng được lưu trữ bên ngoài. Các chức năng được lưu trữ chia sẻ không gian tên của chúng với các chức năng có thể tải. Xem Phần 9. 2. 5, “Phân tích và phân giải tên hàm”, dành cho các quy tắc mô tả cách máy chủ diễn giải các tham chiếu đến các loại hàm khác nhauĐể gọi một thủ tục được lưu trữ, hãy sử dụng câu lệnh 1 (xem Phần 13. 2. 1, “Tuyên bố GỌI”). Để gọi một chức năng đượ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 2 và 0 yêu cầu đặc quyền 4. Nếu có mệnh đề 5, thì các đặc quyền cần có sẽ phụ thuộc vào giá trị 6, như đã thảo luận trong Phần 25. 6, “Kiểm soát truy cập đối tượng được lưu trữ”. Nếu tính năng ghi nhật ký nhị phân được bật, thì 0 có thể yêu cầu đặc quyền của 8, như đã thảo luận trong Phần 25. 7, “Ghi nhật ký nhị phân chương trình được lưu trữ”Theo mặc định, MySQL tự động cấp các đặc quyền 9 và 0 cho trình tạo thường trình. Hành vi này có thể được thay đổi bằng cách vô hiệu hóa biến hệ thống 1. Xem Phần 25. 2. 2, “Các quy trình được lưu trữ và các đặc quyền của MySQL”Các mệnh đề 5 và 3 chỉ định ngữ cảnh bảo mật sẽ được sử dụng khi kiểm tra các đặc quyền truy cập tại thời điểm thực hiện thông thường, như được mô tả sau trong phần nàyNếu tên thường trình giống với tên của một hàm SQL tích hợp, lỗi cú pháp sẽ xảy ra trừ khi bạn sử dụng khoảng trắng giữa tên và dấu ngoặc đơn sau khi xác định thường trình hoặc gọi nó sau này. Vì lý do này, tránh sử dụng tên của các hàm SQL hiện có cho các thường trình được lưu trữ của riêng bạn Chế độ SQL 4 áp dụng cho các chức năng tích hợp sẵn, không áp dụng cho các quy trình được lưu trữ. Luôn cho phép có khoảng trắng sau tên quy trình được lưu trữ, bất kể có bật 4 hay không 6 ngăn lỗi xảy ra nếu đã tồn tại một quy trình có cùng tên. Tùy chọn này được hỗ trợ với cả 0 và 2 bắt đầu với MySQL 8. 0. 29Nếu một hàm tích hợp có cùng tên đã tồn tại, việc cố gắng tạo một hàm được lưu trữ với 9 sẽ thành công với một cảnh báo cho biết rằng nó có cùng tên với một hàm gốc; Nếu một chức năng có thể tải được có cùng tên đã tồn tại, việc cố gắng tạo một chức năng được lưu trữ bằng cách sử dụng 6 sẽ thành công với một cảnh báo. Điều này giống như không chỉ định 6Xem Độ phân giải tên chức năng, để biết thêm thông tin Danh sách tham số được đặt trong ngoặc đơn phải luôn có mặt. Nếu không có tham số, nên sử dụng danh sách tham số trống của 4. Tên tham số không phân biệt chữ hoa chữ thườngMỗi tham số là một tham số 5 theo mặc định. Để chỉ định khác cho một tham số, hãy sử dụng từ khóa 6 hoặc 7 trước tên tham sốGhi chú Việc chỉ định một tham số là 5, 6 hoặc 7 chỉ có hiệu lực đối với một 1. Đối với 2, tham số luôn được coi là tham số 5Một tham số 5 chuyển một giá trị vào một thủ tục. Thủ tục có thể sửa đổi giá trị, nhưng sửa đổi không hiển thị cho người gọi khi thủ tục trả về. Tham số 6 chuyển một giá trị từ thủ tục trở lại trình gọi. Giá trị ban đầu của nó là 6 trong thủ tục và giá trị của nó hiển thị cho người gọi khi thủ tục trả về. Tham số 7 được khởi tạo bởi người gọi, có thể được sửa đổi bởi thủ tục và bất kỳ thay đổi nào được thực hiện bởi thủ tục đều hiển thị cho người gọi khi thủ tục trả vềĐối với mỗi tham số 6 hoặc 7, hãy chuyển một biến do người dùng xác định trong câu lệnh 1 để gọi thủ tục để bạn có thể lấy giá trị của nó khi thủ tục trả về. Nếu bạn đang gọi thủ tục từ bên trong một thủ tục hoặc hàm được lưu trữ khác, bạn cũng có thể truyền tham số thường trình hoặc biến thường trình cục bộ dưới dạng tham số 6 hoặc 7. Nếu bạn đang gọi thủ tục từ bên trong trình kích hoạt, bạn cũng có thể chuyển 83 dưới dạng tham số 6 hoặc 7Để biết thông tin về ảnh hưởng của các điều kiện chưa được xử lý đối với các tham số quy trình, hãy xem Phần 13. 6. 7. 8, “Xử lý điều kiện và Thông số OUT hoặc INOUT” Các tham số thường trình không thể được tham chiếu trong các câu lệnh được chuẩn bị trong thường trình; . 8, “Hạn chế đối với các chương trình được lưu trữ” Ví dụ sau đây cho thấy một thủ tục được lưu trữ đơn giản, được cung cấp mã quốc gia, đếm số lượng thành phố của quốc gia đó xuất hiện trong bảng 86 của cơ sở dữ liệu 87. Mã quốc gia được chuyển bằng tham số 5 và số lượng thành phố được trả về bằng tham số 6 8Ví dụ sử dụng lệnh mysql client 60 để thay đổi dấu phân cách câu lệnh từ 61 thành 62 trong khi quy trình đang được xác định. Điều này cho phép dấu phân cách 61 được sử dụng trong phần thân thủ tục được chuyển qua máy chủ thay vì được giải thích bởi chính mysql . Xem Phần 25. 1, “Định nghĩa các chương trình được lưu trữ”. Điều khoản 64 chỉ có thể được chỉ định cho một 2, điều này là bắt buộc. Nó cho biết kiểu trả về của hàm và thân hàm phải chứa câu lệnh 66. Nếu câu lệnh 67 trả về một giá trị thuộc loại khác, thì giá trị đó sẽ được chuyển sang loại phù hợp. Ví dụ: nếu một hàm chỉ định giá trị 68 hoặc 69 trong mệnh đề 64, nhưng câu lệnh 67 trả về một số nguyên, thì giá trị được trả về từ hàm là chuỗi cho phần tử 68 tương ứng của tập hợp gồm các phần tử 69Hàm ví dụ sau nhận một tham số, thực hiện một thao tác bằng hàm SQL và trả về kết quả. Trong trường hợp này, không cần thiết phải sử dụng 60 vì định nghĩa hàm không chứa dấu phân cách câu lệnh 61 bên trong 6Các kiểu tham số và kiểu trả về của hàm có thể được khai báo để sử dụng bất kỳ kiểu dữ liệu hợp lệ nào. Thuộc tính 36 có thể được sử dụng nếu trước thông số kỹ thuật của 37 38 bao gồm một câu lệnh SQL hợp lệ. Đây có thể là một câu lệnh đơn giản như 39 hoặc 70 hoặc một câu lệnh ghép được viết bằng cách sử dụng 71 và 72. Các câu lệnh ghép có thể chứa các khai báo, vòng lặp và các câu lệnh cấu trúc điều khiển khác. Cú pháp của những câu lệnh này được mô tả trong Phần 13. 6, “Cú pháp câu lệnh ghép”. Trong thực tế, các hàm được lưu trữ có xu hướng sử dụng các câu lệnh ghép, trừ khi phần thân bao gồm một câu lệnh 67MySQL cho phép các thói quen chứa các câu lệnh DDL, chẳng hạn như 74 và 75. MySQL cũng cho phép các thủ tục được lưu trữ (nhưng không phải các chức năng được lưu trữ) chứa các câu lệnh giao dịch SQL, chẳng hạn như 76. Các chức năng được lưu trữ có thể không chứa các câu lệnh thực hiện cam kết hoặc khôi phục rõ ràng hoặc ẩn. Tiêu chuẩn SQL không yêu cầu hỗ trợ cho các câu lệnh này, trong đó nêu rõ rằng mỗi nhà cung cấp DBMS có thể quyết định có cho phép chúng hay không.Các câu lệnh trả về một tập kết quả có thể được sử dụng trong một thủ tục được lưu trữ chứ không phải trong một hàm được lưu trữ. Lệnh cấm này bao gồm các câu lệnh 39 không có mệnh đề 78 và các câu lệnh khác như 79, 840 và 841. Đối với các câu lệnh có thể được xác định tại thời điểm định nghĩa hàm để trả về một tập kết quả, sẽ xảy ra lỗi 842 ( 843). Đối với các câu lệnh chỉ có thể được xác định trong thời gian chạy để trả về một tập kết quả, sẽ xảy ra lỗi 844 ( 845)Các câu lệnh 846 trong các thói quen được lưu trữ không được phép. Khi một thói quen được gọi, một 847 ngầm được thực hiện (và hoàn tác khi thói quen kết thúc). Nguyên nhân khiến thủ tục có cơ sở dữ liệu mặc định nhất định trong khi nó thực thi. Tham chiếu đến các đối tượng trong cơ sở dữ liệu khác với cơ sở dữ liệu mặc định thông thường phải đủ điều kiện với tên cơ sở dữ liệu thích hợpĐể biết thêm thông tin về các câu lệnh không được phép trong các quy trình được lưu trữ, hãy xem Phần 25. 8, “Hạn chế đối với các chương trình được lưu trữ” Để biết thông tin về cách gọi các thủ tục được lưu trữ từ bên trong các chương trình được viết bằng ngôn ngữ có giao diện MySQL, hãy xem Phần 13. 2. 1, “Tuyên bố GỌI” MySQL lưu cài đặt biến hệ thống 848 có hiệu lực khi một quy trình được tạo hoặc thay đổi và luôn thực thi quy trình với cài đặt này có hiệu lực, bất kể chế độ SQL của máy chủ hiện tại khi . .Việc chuyển từ chế độ SQL của trình gọi sang chế độ của thủ tục xảy ra sau khi đánh giá các đối số và gán các giá trị kết quả cho các tham số thủ tục. Nếu bạn xác định một thủ tục trong chế độ nghiêm ngặt SQL nhưng gọi nó trong chế độ không nghiêm ngặt, việc gán đối số cho các tham số thường trình không diễn ra trong chế độ nghiêm ngặt. Nếu bạn yêu cầu các biểu thức được chuyển đến một quy trình được chỉ định ở chế độ SQL nghiêm ngặt, thì bạn nên gọi quy trình có chế độ nghiêm ngặt đang có hiệu lực Đặc tính 849 là một phần mở rộng của MySQL và có thể được sử dụng để mô tả quy trình được lưu trữ. Thông tin này được hiển thị bởi các câu lệnh 00 và 01Đặc tính 02 cho biết ngôn ngữ mà quy trình được viết. Máy chủ bỏ qua đặc điểm này; Một quy trình được coi là “ có tính quyết định ” nếu nó . Nếu cả 03 và 04 đều không được đưa ra trong định nghĩa thông thường, giá trị mặc định là 04. Để tuyên bố rằng một chức năng là xác định, bạn phải chỉ định rõ ràng 03. “not deterministic” otherwise. If neither 03 nor 04 is given in the routine definition, the default is 04. To declare that a function is deterministic, you must specify 03 explicitly.Việc đánh giá bản chất của một thói quen dựa trên “ sự trung thực ” of the creator: MySQL does not check that a routine declared 03 is free of statements that produce nondeterministic results. However, misdeclaring a routine might affect results or affect performance. Declaring a nondeterministic routine as 03 might lead to unexpected results by causing the optimizer to make incorrect execution plan choices. Declaring a deterministic routine as 09 might diminish performance by causing available optimizations not to be used.Nếu tính năng ghi nhật ký nhị phân được bật, đặc tính 03 sẽ ảnh hưởng đến các định nghĩa thường trình mà MySQL chấp nhận. Xem Phần 25. 7, “Ghi nhật ký nhị phân chương trình được lưu trữ”Một thói quen chứa hàm 11 (hoặc các từ đồng nghĩa của nó) hoặc 12 là không xác định, nhưng nó vẫn có thể sao chép an toàn. Đối với 11, nhật ký nhị phân bao gồm dấu thời gian và sao chép chính xác. 12 cũng sao chép chính xác miễn là nó chỉ được gọi một lần duy nhất trong quá trình thực hiện quy trình. (Bạn có thể coi dấu thời gian thực hiện quy trình và hạt giống số ngẫu nhiên là các đầu vào ẩn giống hệt nhau trên nguồn và bản sao. )Một số đặc điểm cung cấp thông tin về bản chất của việc sử dụng dữ liệu theo quy trình. Trong MySQL, những đặc điểm này chỉ mang tính chất tư vấn. Máy chủ không sử dụng chúng để hạn chế loại câu lệnh nào mà một thường trình được phép thực thi
Đặc tính 3 có thể là 5 hoặc 26 để chỉ định bối cảnh bảo mật; . Tài khoản này phải có quyền truy cập cơ sở dữ liệu có liên quan đến quy trình. Giá trị mặc định là 5. Người dùng gọi thủ tục phải có đặc quyền 0 cho nó, cũng như tài khoản 5 nếu thủ tục thực thi trong ngữ cảnh bảo mật của bộ định nghĩaMệnh đề 5 chỉ định tài khoản MySQL sẽ được sử dụng khi kiểm tra các đặc quyền truy cập tại thời điểm thực hiện thường trình cho các thường trình có đặc tính 32Nếu có mệnh đề 5, thì giá trị 6 phải là tài khoản MySQL được chỉ định là 35'@' 36', 37 hoặc 38. Các giá trị 6 được phép tùy thuộc vào các đặc quyền mà bạn nắm giữ, như đã thảo luận trong Phần 25. 6, “Kiểm soát truy cập đối tượng được lưu trữ”. Đồng thời xem phần đó để biết thêm thông tin về bảo mật thường trình được lưu trữNếu mệnh đề 5 bị bỏ qua, định nghĩa mặc định là người dùng thực thi câu lệnh 2 hoặc 0. Điều này giống như chỉ định rõ ràng 43Trong phần thân của quy trình được lưu trữ được xác định bằng đặc tính 32, hàm 37 trả về giá trị 5 của quy trình. Để biết thông tin về kiểm tra người dùng trong các quy trình được lưu trữ, hãy xem Phần 6. 2. 23, “Kiểm tra hoạt động tài khoản dựa trên SQL”Xem xét quy trình sau đây, quy trình này hiển thị số lượng tài khoản MySQL được liệt kê trong bảng hệ thống 47 3Quy trình được chỉ định một tài khoản 5 của 49 bất kể người dùng nào xác định nó. Nó thực thi với các đặc quyền của tài khoản đó bất kể người dùng nào gọi nó (vì đặc điểm bảo mật mặc định là 5). Thủ tục thành công hay thất bại tùy thuộc vào việc người gọi có đặc quyền 0 cho nó và 49 có đặc quyền 39 cho bảng 47Bây giờ, giả sử rằng thủ tục được xác định với đặc tính 55 7Thủ tục vẫn có một 5 của 49, nhưng trong trường hợp này, nó thực thi với các đặc quyền của người dùng đang gọi. Do đó, thủ tục thành công hay thất bại tùy thuộc vào việc người gọi có đặc quyền 0 cho nó và đặc quyền 39 cho bảng 47 hay khôngTheo mặc định, khi một quy trình có đặc tính 32 được thực thi, Máy chủ MySQL không đặt bất kỳ vai trò tích cực nào cho tài khoản MySQL có tên trong mệnh đề 5, chỉ đặt các vai trò mặc định. Ngoại lệ là nếu biến hệ thống 63 được bật, trong trường hợp đó, Máy chủ MySQL đặt tất cả các vai trò được cấp cho người dùng 5, bao gồm các vai trò bắt buộc. Do đó, bất kỳ đặc quyền nào được cấp thông qua các vai trò đều không được kiểm tra theo mặc định khi phát hành câu lệnh 2 hoặc 0. Đối với các chương trình được lưu trữ, nếu việc thực thi xảy ra với các vai trò khác với vai trò mặc định, phần thân chương trình có thể thực thi 67 để kích hoạt các vai trò được yêu cầu. Điều này phải được thực hiện một cách thận trọng vì các đặc quyền được gán cho các vai trò có thể bị thay đổiMáy chủ xử lý kiểu dữ liệu của tham số thường trình, biến thường trình cục bộ được tạo bằng 68 hoặc giá trị trả về của hàm như sau
|