mysql 存储过程 是什么意思

mysql 存储过程 是什么意思,第1张

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

存储过程通常有以下优点:

存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

存储过程能实现较快的执行速度。如果某一 *** 作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

存储过程能过减少网络流量。针对同一个数据库对象的 *** 作(如查询、修改),如果这一 *** 作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

MySQL存储过程创建的格式如下:

CREATE PROCEDURE 过程名 ([过程参数[,...]])

[特性 ...] 过程体

举例代码如下:

CREATE PROCEDURE proc1(OUT s int)  

BEGIN 

    SELECT COUNT(*) INTO s FROM user  

END

存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。

过程体的开始与结束使用BEGIN与END进行标识。

注意:MySQL在5.0以前并不支持存储过程

Mysql的触发器相当于内部处理的一些过程,不带入和带出任何的参数。

其内部使用的参数就是新旧两条记录old和new的字段。

用于完成数据表之间的触发 *** 作,来保证数据库的一致性、完整性。

Mysql的存储过程是类似于其它编程语言中的函数的功能。

存储过程内部可以使用顺序循环和转移三种基本程序结构,而且整个存储过程可以接受和返回参数。

建立存储过程

Create procedure、Create function

下面是它们的格式:

Create proceduresp_Name ([proc_parameter ])

routine_body

这里的参数类型可以是 IN OUT INOUTT ,意思和单词的意思是一样的,IN 表示是传进来的参数,

OUT 是表示传出去的参数,INOUT 是表示传进来但最终传回的参数。

Create functionsp_Name ([func_parameter ])

Returns type

Routine_body

Returns type 指定了返回的类型,这里给定的类型与返回值的类型要是一样的,否则会报错。

下面给出两个简单的例子来说明:

1、 显示 Mysql 当前版本

执行结果

mysql>use welefen

Database changed

mysql>delimiter // #定义//作为结束标记符号

mysql>create procedure getversion(out param1 varchar(50)) #param1为传出参数

->begin

->select version() into param1 #将版本的信息赋值给 param1

->end

->//

Query OK, 0 rows affected (0.00 sec)

mysql>call getversion(@a) #调用getversion()这个存储过程

->//

Query OK, 0 rows affected (0.00 sec)

mysql>select @a

->//

+--------------------------+

| @a |

+--------------------------+

| 5.1.14-beta-community-nt |

+--------------------------+

1 row in set (0.00 sec)

2、 显示”hello world”

执行结果

mysql>delimiter //

mysql>create function display(w varchar(20)) returns varchar(50)

->begin

->return concat('hello ‘,w)

->end

->//

Query OK, 0 rows affected (0.05 sec)

mysql>select display("world")

->//

+------------------+

| display("world") |

+------------------+

| hello world |

+------------------+

1 row in set (0.02 sec)

其他 *** 作存储过程的语句

前面我们已经知道了怎么创建存储过程,下面看看其他常用的用于 *** 作存储过程的语句。

Alter {procedure | function} sp_Name []

Alter 语法是用来改变一个过程或函数的特征,当你想改变存储过程或者函数的结构时可以使

用它。当然你也可以先 drop 它再 create。

Drop {procedure | function} [if exists] sp_Name

Drop 语法即用来删除一个存储程序或者函数,当你创建的一个存储过程或者函数的名字已经存

在时,你想把以前的给覆盖掉,那么此时你就可以使用 drop ,然后在创建。

Show create {procedure | function } sp_Name

Show 语法用来显示创建的存储过程或者函数的信息。这里的 show 用法跟数据表中的 show 用

法是很相似的。

Show {procedure | function} status [like 'partten']

它返回子程序的特征,如数据库,名字,类型,创建者及创建和修改日期。如果没有指定样式,

根据你使用的语句,所有存储程序和存储函数的信息都被列出。

看了以上的几个语法,你是不是感觉跟对表的 *** 作很相象,那你就想对了,他们确实是很相似

的。带着一份激动心情我们继续往下看,你会发现很简单。

Begin ... End 语句

通过 begin end 可以来包含多个语句,每个语句以“”结尾。

Declare

用Declare 来声明局部变量

Declarevar_Name type defaulevaule

Delare 条件

Declarecondition_Name CONDITION FOR condition_value

调用存储过程

Call

格式:

Callsp_Name [parameter ]

这里的 sp_Name 必须是由 create procedure 创建的名称。它可以通过声明的参数来传回值,

它也返回受影响的行数,在 MySQL 中可以通过 mysql_affected_rows() 来获得。

流程控制语句

IF 语句

IFsearch_condition THENstatement_list

[ELSEIFsearch_condition THENstatement_list]

[ELSEstatement_list]

END IF

CASE 语句

CASE case_value

WHEN when_value THENstatement_list

WHEN when_value THENstatement_list]

ELSEstatement_list]

END CASE

LOOP 语句

[begin_label:] LOOP

statement_list

END LOOP [end_label]

LOOP 实现了一个简单的循环,通过 LEAVE 来退出

LEAVE 语句

LEAVE lable

退出语句,一般可以用在循环中。

ITERATE 语句

ITERATE lable

ITERATE 一般出现在 LOOP、REPEATE、WHILE 里,意思是再次循环。

REPEATE 语句

[begin_label:] REPEAT

statement_list

UNTILsearch_condition

END REPEAT [end_label]

REPEAT 语句内的语句或语句群被重复,直至 search_condition 为真。

WHILE 语句

[begin_label:] WHILEsearch_condition DO

statement_list

END WHILE [end_label]

WHILE 语句内的语句或语句群被重复,直至 search_condition 为真。

运用实例

下面通过几个例子来讲述他们的应用:

对网站用户的 *** 作

为了简单,用户表只有用户名和密码的信息.在服务端,我们建立如下的表:

代码片段

Drop table if exists user

Create table user(

Id int unsigned not null auto_increment,

Name varchar(20) not null,

Pwd char(32) not null,

Primary key(Id)

)

添加用户的存储过程:

代码片段

Delimiter //

Create procedure insertuser(in username varchar(20),in userpwd varchar(32))

Begin

Insert into welefen.user(Name,Pwd) values (username,md5(userpwd))

End

//

验证用户的存储过程:

代码片段

Delimiter //

Create procedure validateuser(in username varchar(20),out param1)

Begin

Select Pwd into param1 from welefen.user where Name=username

End

//

修改密码的存储过程:

代码片段

Delimiter //

Create procedure modifyPwd(in username varchar(20),in userpwd varchar(32))

Begin

Update welefen.user set Pwd=md5(userpwd) where Name=username

End

//

删除用户的存储过程:

代码片段

Delimiter //

Create procedure deleteuser(in username varchar(20))

Begin

delete from welefen.user where Name=username

End

//

在客户端,我们给出如下的程序:

代码片段

文件名:ProcedureUser.php

<?php

if (!mysql_connect("localhost","root","welefen")){

echo "连接数据库失败"

}

if (!mysql_select_db("welefen")){

echo "选择数据库表失败<br>"

}

$insert_user=array("welefen","welefen")//这里的welefen分别为用户名、密码

if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){

echo "添加用户$insert_user[0]成功<br>"

}else {

echo "添加用户$insert_user[0]失败<br>"

}

$validate_user=array("welefen","welefen")//这里的welefen分别为用户名、密码

mysql_query("call validateuser('$validate_user[0]',@a)")

$Pwd=mysql_query("select @a")

$result=mysql_fetch_array($Pwd)

if ($result[0]==md5($validate_user[1])){

echo "用户$validate_user[0]验证正确<br>"

}else {

echo "用户$validate_user[0]验证错误<br>"

}

$modify_Pwd=array("welefen","weilefeng")//welefen为用户名weilefeng为新密码

if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){

echo "用户$modigy_Pwd[0]的密码修改成功<br>"

}else {

echo "用户$modigy_Pwd[0]的密码修改失败<br>"

}

$delete_user=array("welefen") //welefen为用户名

if (mysql_query("call deleteuser('$delete_user[0]')")){

echo "用户$delete_user[0]删除成功<br>"

}else {

echo "用户$delete_user[0]删除失败<br>"

}

?

程序运行的结果:

执行结果

添加用户welefen 成功

用户welefen 验证正确

用户welefen 的密码修改成功

用户welefen 删除成功

以上的这个程序简单的说明了Mysql 中的存储过程结合PHP 的应用,当然在实际应用要比这个

复杂的多。

验证角谷猜想

角谷猜想:给定一个整数x,若x%2=1,则x=3*x+1,否则x=x/2,如此循环下去,经过有限步骤必

能得到1。

例如:初 始整数为 9 ,则

9->28->14->7->22->11->34->17->52->26->13->40->20->10->5->16->8->4->2->1

为了说明存储过程中一些语法的应用,我们通过存储过程来实现它:

执行结果

mysql>delimiter //

mysql>create procedure jgguess(in number int)

->begin

->declare param1 int default 1

->set @a=concat(number)

->jiaogu:loop #循环开始

->set param1=number%2

->if param1=1 then set number=number*3+1#number 为奇数,将它乘3加 1

->else set number=number/2

->end if

->set @a=concat(@a,'->',number)

->if number>1 then iterate jiaogu#number 不为 1,继续循环

->end if

->leave jiaogu#退出循环

->end loop jiaogu

->end

->//

Query OK, 0 rows affected (0.00 sec)

mysql>call jgguess(11)

->//

Query OK, 0 rows affected (0.00 sec)

mysql>select @a//

+-------------------------------------------------------+

| @a |

+-------------------------------------------------------+

| 11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 |

+-------------------------------------------------------+

1 row in set (0.02 sec)

在这个存储过程中,你传入的参数不能超过int 型数据的范围,否则就会报错。

触发器

触发器是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。例如当我们向

某个表插入一行数据时发生一个事件或者删除某个记录时触发某个事件。

语法:

CREATE TRIGGER trigger_Name trigger_time trigger_event

ON tbl_Name FOR EACHROW trigger_stmt

trigger_time 是触发器的动作时间。它可以是 BEFORE 或 AFTER ,以指明触发器是在激活它的

语句之前或之后触发。

trigger_event 指明了激活触发器的语句的类型。trigger_event可以是下述值之一:

INSERT:将新行插入表时激活触发器,例如,通过 INSERT、LOADDATA 和 REPLACE 语句;

UPDATE:更改某一行时激活触发器,例如,通过UPDATE语句;

DELETE:从表中删除某一行时激活触发器,例如,通过 DELETE 和 REPLACE 语句。

例如当我们向上面的user 表中增加一个用户名为“welefen ”时,我们把记录用户数的表的值增

加 1

代码片段

Create table numuser(

Num int not null default 0

)

Delimiter //

Create trigger testnum after insert on welefen.user for each row

Begin

Update welefen.numuser set Num=Num+1

End

//

视图

当我们想得到数据表中某些字段的信息,并想把他们保存时我们就可以用视图。

语法:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

VIEW view_Name [(column_list)]

AS select_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]

例如我们想对上面的用户表使用视图,可以这样:

Create viewwelefen.userview as select * fromwelefen.user

查看视图的信息可以使用:

Select * fromwelfen.userview


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8663771.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存