Tôi muốn tạo một hàm với các đối số tùy chọn trong MySQL. Ví dụ, tôi muốn tạo hàm tính toán trung bình các đối số của nó. Tôi tạo ra một hàm của năm đối số, nhưng khi người dùng chỉ chuyển hai đối số cho hàm thì nó vẫn chạy và trả về giá trị trung bình của hai đối số.Tạo một hàm với các đối số tùy chọn trong MySQL
Trả lời
Bạn không thể đặt tham số tùy chọn trong thủ tục được lưu trữ MySQL.
Tuy nhiên, bạn có thể đặt các tham số tùy chọn trong một UDF của MySQL.
Bạn biết rằng MySQL có số AVG aggregate function?
Cách giải quyết Nếu bạn có thể đối mặt với sự xấu xí của giải pháp này, đây là đoạn mã sử dụng chuỗi phân cách bằng dấu phẩy có giá trị làm đầu vào và trả về giá trị trung bình.
DELIMITER $$
CREATE FUNCTION MyAvg(valuestr varchar) RETURNS float
BEGIN
DECLARE output float;
DECLARE arg_count integer;
DECLARE str_length integer;
DECLARE arg float;
DECLARE i integer;
SET output = NULL;
SET i = LENGTH(valuestr);
IF i > 0 THEN BEGIN
SET arg_count = 1;
WHILE i > 0 DO BEGIN
IF MID(valuestr, i, 1)
SET i = i - 1;
END; END WHILE;
/* calculate average */
SET output = 0;
SET i = arg_count;
WHILE i > 0 DO BEGIN
SET arg = SUBSTRING_INDEX(
SUBSTRING_INDEX(valuestr, ',' , i)
, ',', -1);
SET output = output + arg;
SET i = i - 1;
END; END WHILE;
SET output = output/arg_count;
END; END IF;
RETURN output;
END $$
DELIMITER ;
Sử dụng concat_ws để nạp chức năng.
SELECT MyAvg(CONCAT_WS(',',100,200,300,500)) AS test;
Bạn cũng có thể write an UDF trong C(++) hoặc Delphi/Lazarus
Tôi không thấy thông số tùy chọn của UDF ở đâu. Bên cạnh đó, 'SQL ERROR (1064) Bạn có một lỗi trong Cú pháp SQL của bạn ...' – Pacerier
Tôi không nghĩ câu lệnh này là đúng: "Tuy nhiên, bạn có thể thiết lập các tham số tùy chọn trong một UDF của MySQL". Bạn có lẽ nên nói một cái gì đó như thế này: "Bạn không thể thiết lập một tham số tùy chọn trong một UDF MySQL, nhưng đây là một công việc xung quanh". Bạn không thể có một tham số tùy chọn trong một kho lưu trữ Proc, và tôi khá chắc chắn điều tương tự là đúng của một UDF. – Tom
@Tom một UDF là một cái gì đó khác với chức năng người dùng mysql. Nó là một hàm mà bạn viết trong C/C++, có thể được nhập vào MySQL, và nó hỗ trợ các đối số tùy chọn. – juacala
Trong khi xa là một giải pháp lý tưởng, dưới đây là cách tôi giải quyết thông số tùy chọn cho một hàm concat tôi cần:
delimiter ||
create function safeConcat2(arg1 longtext, arg2 varchar(1023))
returns longtext
return safeConcat3(arg1, arg2, '');
||
create function safeConcat3(arg1 longtext, arg2 varchar(1023), arg3 varchar(1023))
returns longtext
return safeConcat4(arg1, arg2, arg3, '');
||
create function safeConcat4(arg1 longtext, arg2 varchar(1023), arg3 varchar(1023), arg4 varchar(1023))
returns longtext
begin
declare result longText;
set result = concat(arg1, arg2, arg3, arg4);
if(result is null) then
set result=arg1;
end if;
return result;
end
||
Lưu ý: Điều này có nghĩa bạn phải gọi phương thức tương ứng với số lượng args.
Cách tiếp cận khác là chỉ chuyển một tham số 'siêu' là chuỗi có dấu phẩy trong đó tách các thông số thực. Thủ tục mysql có thể phân tích cú pháp tham số 'siêu' thành các tham số thực sự riêng biệt. Ví dụ:
create procedure procWithOneSuperParam(param1 varchar(500))
declare param2 varchar(100);
begin
if LOCATE(',',param1) > 0 then
.. param2=<extract the string after the ',' from param1> ..
- 1. Làm cách nào để tạo một hàm Python với các đối số tùy chọn?
- 2. Tạo một đối tượng trong C# từ F # đối tượng với đối số tùy chọn
- 3. Trong Apps Script, Cách bao gồm các đối số tùy chọn trong các hàm tùy chỉnh
- 4. Viết các hàm ggplot trong R với các đối số tùy chọn
- 5. Trong JavaScript, làm thế nào tôi có thể tạo một hàm với tham số tùy chọn?
- 6. Tùy chọn args trong các hàm MATLAB
- 7. đối số tùy chọn trong các chức năng fortran
- 8. Activator.CreateInstance với các tham số tùy chọn
- 9. Cách tạo chức năng elisp tương tác với các đối số tùy chọn
- 10. Đối số tùy chọn LaTeX
- 11. Đóng cửa PHP dưới dạng đối số hàm tùy chọn
- 12. Có cách nào để tạo các đối số tùy chọn cho các hàm trong vb script không?
- 13. Làm thế nào để bạn tạo các đối số tùy chọn trong php?
- 14. Trong C++, là một hàm tạo với chỉ các đối số mặc định là một hàm tạo mặc định?
- 15. Chuyển các đối số hàm tới một hàm bên trong?
- 16. Đối số tùy chọn trong macro macro
- 17. javascript đối số tùy chọn chức năng
- 18. Đối số tùy chọn trong defgeneric?
- 19. Cách tạo một từ điển trống cho đối số tùy chọn trong VB.NET
- 20. Đối số tùy chọn C++/CLI
- 21. Kiểm tra các đối số tùy chọn trong PHP
- 22. Chức năng Javascript và các đối số tùy chọn
- 23. Gửi đối số cho một hàm tạo tĩnh trong Java?
- 24. Đối số được đặt tên tùy chọn trong Mathematica
- 25. cxf: tạo hàm tạo jaxb với đối số
- 26. hàm tương tác emacs với tiền tố số tùy chọn
- 27. Tùy chọn khởi tạo đối tượng C#
- 28. EventHandler với các đối số tùy chỉnh
- 29. Cách nhận tất cả đối số được chuyển đến hàm (so với tùy chọn chỉ $ args)
- 30. Giảm số đối số cho một hàm tạo
liên quan: http://stackoverflow.com/questions/91150/mysql-stored-procedure –
trùng lặp: http://stackoverflow.com/questions/12652241/writing-optional-parameters-within -stored-procedures-in-mysql –
Không thể thực hiện được. Các câu trả lời dưới đây là cách giải quyết. – Tom