mysql学习笔记五----存储过程

原创 2014年04月14日 15:53:59

存储过程(procedure)

是Mysql在标准的sql语言上的扩展. 存储过程不仅允许嵌入sql语言,还可以定义变量,允许使用条件语句和循环语句,这样使得它的功能变得更加强大。

1.创建

create procedure 过程名(参数1…) 

begin

   declare 变量名  类型;

   执行语句;

end$$

如:

(1)不带参数

delimiter $$   //修改语句结束标示符

        create procedure pro2() 

         begin 

             insert into users values(NULL,'test','123456',1);

        end$$

(2)带参数

create procedure pro5(myid int)

begin

select * from t1 where id=myid;

end$$

2.调用

call 过程名(传入参数..)

如: call pro2()$$

         call pro5(1)$$

或者在php中调用如下:

(1)$mysqli = new mysqli('127.0.0.1','root','123456','test');

if($mysqli->connect_error)

{

die('connect error('.$mysqli->connect_errno.')'.$mysqli->connect_error);

}

if(mysqli_connect_error())

{

die('connect error ('.mysqli_connect_errno().')'.mysqli_connect_error());

}

if($mysqli->query("call test.pro2()"))

{

echo "success<br/>";

}

else

{

echo "falied<br/>";

}

(2)$con=mysql_connect("localhost","root","root");

if(!$con){

die('error');

}

 

mysql_select_db("test");

 

if($res=mysql_query("call test.pro5(1)")){

while($row=mysql_fetch_assoc($res)){

echo "<pre>";

print_r($row);

echo "</pre>";

}

}

3.存储过程-参数in out inout

过程用于执行特定的操作.当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out). 或者(inout) ,默认是in

create procedure 过程名(in 变量 变量类型…, out 变量 变量类型,

out 变量 变量类型) 

begin

执行语句; 

end;

例子:

create procedure pro6(in myid int,out myname varchar(255)) 

begin 

select name into myname from test where id=myid; 

end$$

调用:call pro6(2,@myname)$$

             select @myname$$

4.光标(游标) cursor

定义游标:

DECLARE 光标名 CURSOR FOR select 语句;

打开游标: 

open 光标名;

取出当前游标指向的行.

fetch 光标名 into 其它变量;

判断游标是否指向记录最后,游标一般是循环的取出,因此,通常在repeate语句中使用.(通常的结构如下代码)

语法结构如下:

create procedure 过程名()

begin

#这里很重要设置一个标志符

DECLARE done INT DEFAULT 0;

DECLARE cur1 CURSOR FOR sql语句;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

open cur1;

#遍历光标

REPEAT

fetch cur1 into 变量;

IF NOT done THEN

//do something

end if; 

UNTIL done END REPEAT;

close cur1;

end$$

示例:

create procedure pro9(in indeptno int)

begin

#这里很重要设置一个标志符

DECLARE done INT DEFAULT 0;

declare oldsal decimal;

declare myempno int;

DECLARE cur1 CURSOR FOR SELECT sal,empno FROM emp where deptno=indeptno;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

open cur1;

#遍历光标

REPEAT

fetch cur1 into oldsal,myempno;

IF NOT done THEN

if oldsal<200 then

update emp set sal=sal+100 where empno=myempno;

end if;

end if; 

UNTIL done END REPEAT;

close cur1;

end$$

--控制台调用

call pro9(10)$$

--php程序调用

$con=mysql_connect("localhost","root","root");

if(!$con){

die('error');

}

 

mysql_select_db("test");

 

if(mysql_query("call test.pro9(10)")){

echo "up ok";

}

 

5.变量SET语句

在存储过程中,我们可以通过set语句来给某个变量赋值。

示例:

create procedure pro0()

begin

declare aa int;

set aa=120;

select aa;

end$$

6.控制结构-条件

(1)IF search_condition THEN statement_list

    //do something

END IF

(2)IF search_condition THEN statement_list

//do something     

ELSE statement_list

//do something

END IF

(3)IF search_condition THEN statement_list

    ELSEIF search_condition THEN statement_list ...

    ELSE statement_list

END IF

示例:

create procedure pro11(in myname varchar(255)) begin declare mysal int; select sal into mysal from emp where empName=myname; if mysal < 5000 then update emp set sal=sal+sal*0.1 where empName=myname;end if; end$$

 7.控制结构--循环语句

(1)loop 
执行语句…;
end loop

示例

create procedure pro12(in userName varchar(255),in maxId int) begin declare var1 int default 0; label1:loop set var1 = var1 +1; if var1 < maxId then insert into aaa values(var1,userName); iterate label1;end if; leave label1;end loop label1; end$$

(2)WHILE search_condition DO    
statement_list
END WHILE 

示例:

--创建表
create table users(id int primary key , name varchar(32));
--存储过程
create procedure pro13(in name varchar(32))
begin
declare mynum int default 0;
declare startno int default 11;
while mynum<10 do
insert into users values(startno,name);
set mynum=mynum+1;
set startno=startno+1;
end while;
end$$
--调用
call pro13('abc')$$

(3)REPEAT    
statement_list
UNTIL search_condition
END REPEAT

示例:

--存储过程
create procedure pro14(in name varchar(32))
begin
declare mynum int default 0;
declare startno int default 21;
repeat 
insert into users values(startno,name);
set mynum=mynum+1;
set startno=startno+1;
until mynum>9 end repeat;
end$$


MySQL存储过程学习笔记

一、基本语法及简单实例 1、创建简单的测试环境 mysql> use test; Database changed mysql> show tables; Empty set (0.00 se...
  • horace20
  • horace20
  • 2011年12月09日 11:07
  • 17813

MySQL存储过程学习笔记

一、基本语法及简单实例 1、创建简单的测试环境 [sql] view plaincopyprint? mysql> use test;  Database c...

mysql存储过程学习笔记--变量、参数、注释

变量 存储过程变量定义: DECLARE variable_name [,variable_name...] datatype [DEFAULT value]; ...

MySQL入门很简单-学习笔记 - 第14章 存储过程和函数

避免编写重复的语句 安全性可控 执行效率高   14.1、创建存储过程和函数 14.1.1、创建存储过程 CREATE PROCEDUREsp_name ([proc_parameter[,...]]...
  • KimSoft
  • KimSoft
  • 2011年09月09日 15:38
  • 5812

Mysql存储过程学习笔记

案例一: CREATE TABLE Employee( -- 创建普通表 id int, first_name VARCHAR...
  • he90227
  • he90227
  • 2014年12月05日 13:36
  • 685

mysql存储过程学习笔记2

/*1.根据生日计算年龄的函数*/ DELIMITER // DROP FUNCTION IF EXISTS getAage;// CREATE FUNCTION getAage(birth D...

Mysql 存储过程学习笔记

基本语法: 一、创建存储过程create procedure name() begin sql end二、调用存储过程call name()注意:存储过程名称后面必须加括号三、删除存储过程drop ...
  • a837756
  • a837756
  • 2016年11月24日 18:10
  • 145

Mysql学习笔记七,存储过程和函数

什么是函数和存储过程 存储过程和函数是事先经过编译并存储在数据库中的一段 SQL 语句的集合。 存储过程和函数的区别在于函数必须有返回值, 而存储过程没有, 存储过程的参数可以 使用IN、 OU...

MYSQL学习笔记(十九)使用存储过程

存储过程 存储过程就是为以后使用而保存的一条或多条SQL语句 存储过程的应用 (1)通过把处理封装在一个易用的单元中,可以简化复杂的操作。 (2)由于不要求反复建立一系列处理步骤,因而保证了数据...

MYSQL学习笔记(十)存储过程(续)

1.存储过程:是SQL语句和控制语句的集合,以一个名称存储并作为一个单元处理。 2.参数类型 输入类型:IN表示该参数的值必须在调用存储过程时指定 输出类型:OUT表示该参数的值可以被存储过程改...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql学习笔记五----存储过程
举报原因:
原因补充:

(最多只允许输入30个字)