2011-02-03 34 views
14

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

+0

liên quan: http://stackoverflow.com/questions/91150/mysql-stored-procedure –

+0

trùng lặp: http://stackoverflow.com/questions/12652241/writing-optional-parameters-within -stored-procedures-in-mysql –

+2

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

Trả lời

4

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

+3

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

+1

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

+0

@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

3

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.

1

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> .. 
Các vấn đề liên quan