创建存储过程
MySQL中,创建存储过程的基本形式如下:
- CREATE PROCEDURE sp_name ([proc_parameter[,...]])
- [characteristic ...] routine_body
其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数列表; characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束。
【示例14-1】 下面创建一个名为num_from_employee的存储过程。代码如下:
- CREATE PROCEDURE num_from_employee (IN emp_id INT, OUT count_num INT )
- READS SQL DATA
- BEGIN
- SELECT COUNT(*) INTO count_num
- FROM employee
- WHERE d_id=emp_id ;
- END
上述代码中,存储过程名称为num_from_employee;输入变量为emp_id;输出变量为count_num。SELECT语句从employee表查询d_id值等于emp_id的记录,并用COUNT(*)计算d_id值相同的记录的条数,最后将计算结果存入count_num中。代码的执行结果如下:
- mysql> DELIMITER &&
- mysql> CREATE PROCEDURE num_from_employee
(IN emp_id INT, OUT count_num INT ) - -> READS SQL DATA
- -> BEGIN
- -> SELECT COUNT(*) INTO count_num
- -> FROM employee
- -> WHERE d_id=emp_id ;
- -> END &&
- Query OK, 0 rows affected (0.09 sec)
- mysql> DELIMITER ;
代码执行完毕后,没有报出任何出错信息就表示存储函数已经创建成功。以后就可以调用这个存储过程,数据库中会执行存储过程中的SQL语句。
#执行存储过程
CALL Pro_Employee(101,@pcount);
SELECT @pcount;
创建存储函数
- mysql> DELIMITER &&
- mysql> CREATE FUNCTION name_from_employee (emp_id INT )
- -> RETURNS VARCHAR(20)
- -> BEGIN
- -> RETURN (SELECT name
- -> FROM employee
- -> WHERE num=emp_id );
- -> END&&
- Query OK, 0 rows affected (0.00 sec)
- mysql> DELIMITER ;
调用方法:
//调用存储函数
mysql> SELECT name_from_employee(3);
存储过程里面也能够使用函数:
mysql> delimiter $$
mysql> CREATE FUNCTION isodd(input_number int) //创建函数
-> RETURNS int
-> BEGIN
-> DECLARE v_isodd INT;
->
-> IF MOD(input_number,2)=0 THEN
-> SET v_isodd=FALSE;
-> ELSE
-> SET v_isodd=TRUE;
-> END IF;
->
-> RETURN(v_isodd);
->
-> END$$
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE PROCEDURE myProc(aNumber int) //创建mysql存储过程
-> Begin
-> IF (isodd(aNumber)) THEN
-> SELECT ' is odd';
-> ELSE
-> SELECT ' is even';
-> END IF;
-> END$$
Query OK, 0 rows affected (0.02 sec)
mysql> delimiter ;
mysql> call myProc(2); //call 调用存储过程
+----------+
| is even |
+----------+
| is even |
+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> call myProc(1); //call 调用存储过程
+---------+
| is odd |
+---------+
| is odd |
+---------+
1 row in set (0.00 sec)
mysql> drop procedure myProc; //删除mysql存储过程
Query OK, 0 rows affected (0.00 sec)
mysql> drop function isodd; //删除mysql函数
Query OK, 0 rows affected (0.00 sec)
用完了,要记得删除。不然占用资源。
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
存储过程和函数存在以下几个区别:
1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程,功能强大,可以执行包括修改表等一系列数据库操作;用户定义函数不能用于执行一组修改全局数据库状态的操作。
2)对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类~~存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
3)存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
4)存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。(意思是存储过程要单独调用,一般用call来调用)
mysql常见的内置函数:
concat
pow 乘方
mod 取余
strcmp