猎八哥浅谈存储过程——数据库中的双刃剑

 

存储过程是指:为完成特定任务的一条或多条MYSQL语句的集合。

猎八哥原创,本文原址链接:http://www.cnblogs.com/liebagefly/p/7521974.html 

存储过程的优势:

1.执行速度快。存储过程只编译一次,以后每次执行都不需要重新编译,而sql语句每次执行都需要编译一次,所以存储过程的执行速度快。(当然第一次的速度并不比sql语句快)。

2.减少数据库开发人员的工作量,存储过程可以多次使用。

3.安全性好,可以设置某些用户才具有对指定存储过程的使用权,存储过程的参数化可以防止SQL注入攻击。

4.可封装性,使复杂的操作简单化,调用存储过程的时候不需要传递过多的SQL语句,只需要传递名称以及参数即可。

5.减少网络流量。调用存储过程的时候不需要传递过多的SQL语句,只需要传递名称以及参数(当然有的存储过程没有参数就无需传递参数了,但是注意调用存储过程一定要记得加()括号)就可以了,因此降低了网络传输的数据量。

 缺点:1.存储过程可移植性差,不同数据库的存储过程的语法差别较大。(但是我感觉谁会没事乱该数据库呀!今天你用mysql,明天你用oracle,如果更改数据库意味着项目有着重大变动,要更改众多的东西,所以这点存储过程的更改算不了什么)

2.维护困难,当需求变化或者项目需要扩展时会导致修改较为麻烦。(这个就比较坑了,各种更改的确麻烦)。

总之存储过程是把双刃剑,具体用或不用要具体问题具体分析。下面看一些存储过程的常用方法和语句。

存储过程常用语句

展示所有存储过程:show procedure status;

展示存储过程的创建语句:show create procedure procedurename;

删除存储过程:DROP  PROCEDURE  procedurename ;

  

存储过程关键字介绍:
in为传递给存储过程(默认不写),out从存储过程传出,inout从存储过程传入或传出,into对变量进行赋值

学生表的建表语句。

存储过程特点:A.调用存储过程,可以显示结果,也可以不显示结果。

B.每个表中的存储过程不能修改,不能覆盖;也不能出现类似java语言的重载(即:不能建立参数个数不同但存储过程名字相同的存储过:)。

(1)不显示结果类型的。

学生表
CREATE TABLE `student` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `zongfen` int(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk

创建存储过程,out表示相应的参数用来从存储过程传出一个值,into表示给p1等赋值
1.创建存储过程 create procedure zongfenmma( out p1 DECIMAL(8,2), out ph DECIMAL(8,2), out pa DECIMAL(8,2) ) begin select MIN(zongfen) into p1 from student; select MAX(zongfen) into ph from student; select AVG(zongfen) into pa from student; end; 2.调用存储过程,调用此存储过程不显示结果,它返回以后可以显示(或者处理中需要使用)的变量(@zongfenmin)。 call zongfenmma( @zongfenmin,@zongfenmax,@zongfenavg ); 3.显示变量的值即最小、最大、平均值。 select @zongfenmin,@zongfenmax,@zongfenavg;

                    

 

(2)显示结果类型的。

1.创建存储过程;注意注意:创建存储过程必须要有括号(),即使无参数也要添加。
create procedure zongfenmax()
begin 
    select MAX(zongfen) as zfmax from student;
end;

2.调用存储过程,并返回结果。 call zongfenmax();

(3)案例:创建一个存储过程,获取学生的名字,不过成绩及格的学生要名字大写。

思路:获取学生名字,如果成绩及格将名字大写,返回名字。话不多说,直接上代码。

create procedure cjavg(
    in oid int,
    in pass boolean,
    out oname VARCHAR(50)
)
begin
    DECLARE name1 VARCHAR(50);
    SELECT name from student where id = oid into name1;
    IF pass THEN
	SELECT upper(name1) into name1;
    END IF;
   SELECT name1 into oname;
end;

在过程begin和end中定义一个变量name1,获取学生姓名并传给name1,
判断是否及格,如果成绩及格,名字大写,选择名字传给oname,

call cjavg(1,1,@name);
调用村纯过程,注意,第一个1是int型,是oid,第二个是boolean型,
1表示成绩及格,0表示不及格

显示名字
SELECT @name;

  

删除存储过程:drop procedure zongfenmax;注意删除存储过程时不要加()。

 

posted @ 2017-11-09 15:43  猎八哥FLY  阅读(333)  评论(0编辑  收藏  举报