MySQL 自定义函数 语法:
CREATE FUNCTIONsp_name([func_parameter[,...]])
RETURNStype
[characteristic...]routine_body
func_parameter:
param_nametype
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
routine_body:
Valid SQL procedure statement or statements
MySQL 系统函数
·INSERT(str,pos,len,newstr)
返回字符串str, 其子字符串起始于pos位置和长期被字符串newstr取代的len字符。 如果pos超过字符串长度,则返回值为原始字符串。 假如len的长度大于其它字符串的长度,则从位置pos开始替换。若任何一个参数为null,则返回值为NULL。
mysql>SELECT INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'
mysql>SELECT INSERT('Quadratic', -1, 4, 'What');
-> 'Quadratic'
mysql>SELECT INSERT('Quadratic', 3, 100, 'What');
-> 'QuWhat'
·INSTR(str,substr)
返回字符串str中子字符串的第一个出现位置。这和LOCATE()的双参数形式相同,除非参数的顺序被颠倒。
mysql>SELECT INSTR('foobarbar', 'bar');
-> 4
mysql>SELECT INSTR('xbar', 'foobar');
-> 0
mysql>
mysql> delimiter $$
mysql>
mysql> CREATE FUNCTION myFunction
(
in_string VARCHAR(255),
in_find_str VARCHAR(20),
in_repl_str VARCHAR(20))
RETURNS VARCHAR(255)
BEGIN
DECLARE l_new_string VARCHAR(255);
DECLARE l_find_pos INT;
SET l_find_pos=INSTR(in_string,in_find_str);
IF (l_find_pos>0) THEN
SET l_new_string=INSERT(in_string,l_find_pos,LENGTH (in_find_str),in_repl_str);
ELSE
SET l_new_string=in_string;
END IF;
RETURN(l_new_string);
END$$
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> delimiter ;
mysql> select myFunction('ABC','A','Z');
+---------------------------+
| myFunction('ABC','A','Z') |
+---------------------------+
| ZBC |
+---------------------------+
1 row in set (0.00 sec)
mysql> drop function myFunction;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql中的UDF(自定义函数),其实是个好东西,比如可以写好一些方法或
函数,然后进行调用,而且是在SQL语句中可以进行调用。
DROP FUNCTION CalculateAmount
CREATE FUNCTION CalculateAmount(userid INT)
RETURNS float(10,2)
BEGIN
DECLARE totalCredits FLOAT;
SELECT SUM(amount) INTO totalAmount FROM credit_user WHERE id =userid;
RETURN totalAmount;
END
要注意的是,在UDF中,不要定义与数据表中重名的列。而在SQL中,
则可以象如SELECT CalculateAmount(1);那样去调用了