一、存储过程
存储过程是存储在数据库目录中的一段声明性sql语句,感觉其功能类似函数。
1.简单的存储过程
我们可以通过create procedure procedure_name 语句创建存储过程,然后通过call procedure_name 语句调用存储过程。
delimiter // create procedure procedure_name( ) begin select * from table_name end // delimiter ;
下面我们来详细的说明上述存储过程:
- 第一个命令delimiter // ,与存储过程语法无关。它是将标准分隔符--逗号(;)改为--双斜杠(//)。因为我们想将存储过程作为整体传给服务器,而不是让MySQL依次解释每个语句。关键字end后使用分隔符//来指示存储过程的结束,左后将分隔符该回分号。
- 使用create procedure语句创建存储过程。
- begin 和 end 之间的部分是存储过程的主题,将声明性的sql语句放在主题中以处理业务逻辑。
2.声明变量
要在存储过程中声明一个变量,可使用declare 语句,其基本语法格式如下:
declare variable_name datetype( size ) default default_value;
声明变量后,就可以开始使用变量了。我们可以使用set 语句为其分配值,也可以使用 select into 语句将查询结果分配给一个变量.
例如,假设我们有一个产品表(products),我们声明两个变量 total_count 和 m,将totla_count赋值为10,将products表的数据个数赋值给m:
declare total_count,m int default 0; set total_count = 10; select count(*) into m from products;
注意:变量有自己的范围(作用域),它用来定义它的生命周期。 如果在存储过程中声明一个变量,那么当达到存储过程的END语句时,它将超出范围,因此在其它代码块中无法访问。
3.参数简介
mysql中参数有三种模式:IN、 OUT或INOUT
- IN: 是默认模式。在存储过程中定义IN参数时,调用程序必须将参数传递给存储过程。另外,IN参数的值被保护,这就是说存储过程只使用IN参数的副本,对副本的操作不影响参数本身。
- OUT: 可以在存储过程中更改OUT参数的值,并将修改后的新值传递回调用函数,但是存储过程启动时无法访问OUT参数的初始值。
- INOUT: 是上面两种参数的结合,调用程序可以传递参数,并且存储过程中修改INOUT参数的值可以传递回调用函数。
存储过程中定义参数的语法如下:
MODE param_name param_type( param_size )
根据存储过程中参数的目的,MODE可以是IN、OUT或INOUT。
以下示例说明如何使用GetOfficeCountry存储过程中的IN参数,来查询选择位于特定国家的办公室。
use yiibaidb; drop procedure in exists 'GetOfficeCountry'; delimiter $$ use yiibaidb $$ create procedure GetOfficeCountry( IN countryName varchar(255) ) begin select * from offices where country = countryName; end $$ delimiter ;
假设我们要查询在美国(USA)的所有办事处,只需要将参数UAS传递给GetOfficeCountry这个存储过程,如下:
call GetOfficeCountry('USA');