My SQL 高级部分

一、存储过程

存储过程是存储在数据库目录中的一段声明性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');

 

你可能感兴趣的:(My SQL 高级部分)